原信息
qid     cid     pid     ptid    pbid    ptName  pbName  Model  comName   pName           QuotePrice   QuoteTime              ModPerson
11 2 8 9 10 mp4 爱国者 F335     九天成通  爱国者视觉王 5000.0     2007-10-18 15:22:49.000 Admin
10 1 8 9 10 mp4 爱国者 F335     九洲嘉园  爱国者视觉王 1000.0     2007-10-18 15:22:38.000 Admin
5 3 8 9 10 mp4 爱国者 F335     测试公司  爱国者视觉王 1500.0     2007-10-18 15:21:03.000 Admin
3 3 6 6 10 数码相机 爱国者 DC-V800 测试公司 爱国者数码相机 500.0     2007-10-18 15:22:01.000 Admin
7 2 6 6 10 数码相机 爱国者 DC-V800 九天成通  爱国者数码相机 8000.0     2007-10-18 15:21:43.000 Admin
6 1 6 6 10 数码相机 爱国者 DC-V800 九洲嘉园  爱国者数码相机 1000.0     2007-10-18 15:21:35.000 Admin
9 3 7 8 9 mp3 纽曼 F99      测试公司  纽曼之音          1000.0     2007-10-18 15:22:28.000 Admin
8 1 7 8 9 mp3 纽曼 F99      九洲嘉园  纽曼之音          500.0     2007-10-18 15:22:16.000 Admin
4 2 7 8 9 mp3 纽曼 F99      九天成通  纽曼之音          1000.0     2007-10-18 15:20:54.000 Admin修改后变成
qid cid pid ptid pbid ptName  pbName pName Model   comName1 Price1 comName2 Price2 comName3 Price3  QuoteTime                ModPerson
1   2 8   9  10   mp4     爱国者  视觉王 F335     九洲嘉园  1000.0 测试公司  1500.0 九天成通  5000.0  2007-10-18 15:22:49.000  Admin
2   3 6   6  10   数码相机 爱国者  视觉王 DC-V800  测试公司  500.0  九天成通   1000.0 九洲嘉园  8000.0  2007-10-18 15:22:49.000  Admin
....合并条件是 同产品 同条件 同日期 price是最低价格取3个 最低的放到price1 然后是2和3,排序按时间 然后是产品名称,请问能应该怎么实现啊。

解决方案 »

  1.   

    --用此例的方法生成一个子表.
    有一表
    a    b        c
    7    aa      153
    9    aa      152
    6    aa      120
    8    aa      168
    5    bb      159
    7    bb      179
    8    bb      149
    9    bb      139
    6    bb      169
    对b列中的值来分类排序并分别加一序号,形成一新表
    px a    b        c
    1  6    aa      120
    2  9    aa      152
    3  7    aa      153
    4  8    aa      168
    1  9    bb      139
    2  8    bb      149
    3  5    bb      159
    4  6    bb      169
    5  7    bb      179
    declare @tab table(a int,b varchar(2),c int)insert @tab values(7,'aa',153)
    insert @tab values(9,'aa',152)
    insert @tab values(6,'aa',120)
    insert @tab values(8,'aa',168)
    insert @tab values(5,'bb',159)
    insert @tab values(7,'bb',179)
    insert @tab values(8,'bb',149)
    insert @tab values(9,'bb',139)
    insert @tab values(6,'bb',169)select * from @tabselect px=(select count(1) from @tab where b=a.b and c<a.c)+1 , a,b,c from @tab a
    order by b , c px          a           b    c           
    ----------- ----------- ---- ----------- 
    1           6           aa   120
    2           9           aa   152
    3           7           aa   153
    4           8           aa   168
    1           9           bb   139
    2           8           bb   149
    3           5           bb   159
    4           6           bb   169
    5           7           bb   179(所影响的行数为 9 行)
    在上面例中我们看到,以B分类排序,C是从小到大,如果C从大到小排序,即下面结果:
    px a    b        c
    1  8    aa      168
    2  9    aa      153
    3  7    aa      152
    4  6    aa      120
    1  7    bb      179
    2  6    bb      169
    3  5    bb      159
    4  8    bb      149
    5  9    bb      139declare @tab table(a int,b varchar(2),c int)insert @tab values(7,'aa',153)
    insert @tab values(9,'aa',152)
    insert @tab values(6,'aa',120)
    insert @tab values(8,'aa',168)
    insert @tab values(5,'bb',159)
    insert @tab values(7,'bb',179)
    insert @tab values(8,'bb',149)
    insert @tab values(9,'bb',139)
    insert @tab values(6,'bb',169)select * from @tabselect px=(select count(1) from @tab where b=a.b and c>a.c)+1 , a,b,c from @tab a
    order by b , c descpx          a           b    c           
    ----------- ----------- ---- ----------- 
    1           8           aa   168
    2           7           aa   153
    3           9           aa   152
    4           6           aa   120
    1           7           bb   179
    2           6           bb   169
    3           5           bb   159
    4           8           bb   149
    5           9           bb   139(所影响的行数为 9 行)--同时按两列分组
    例如有一个表M 有A B C三列,其中值为
     A   B   C
     a1  b1  c1
     a1  b1  c2
     a1  b2  c1
     a2  b2  c2
     a2  b2  c3
     a1  b2  c4
     要求将其数据以A ,B列作为分组条件保存在别一个表N中,并区分不同组的明细资料(如加个区分列D)具体形式如下:
      A  B    C   D
     a1  b1  c1   1
     a1  b1  c2   1
     a1  b2  c1   2 
     a2  b2  c2   3 
     a2  b2  c3   3
     a1  b2  c4   2
    帮忙想一下写法,想两天啦,还是搞不定,谢谢大家啦!
    declare @M table(A varchar(4),B varchar(4),C varchar(4))
    insert into @M select 'a1','b1','c1'
    insert into @M select 'a1','b1','c2'
    insert into @M select 'a1','b2','c1'
    insert into @M select 'a2','b2','c2'
    insert into @M select 'a2','b2','c3'
    insert into @M select 'a1','b2','c4'select t.*,(select count(distinct A+'|'+B) from @M where A<t.A or (A=t.A and B<=t.B)) as D from @M t/*
    A    B    C    D           
    ---- ---- ---- ----------- 
    a1   b1   c1   1
    a1   b1   c2   1
    a1   b2   c1   2
    a2   b2   c2   3
    a2   b2   c3   3
    a1   b2   c4   2
    */
    create table m(A varchar(10),B varchar(10),C varchar(10))
    insert into m values('a1',  'b1',  'c1')
    insert into m values('a1',  'b1',  'c2')
    insert into m values('a1',  'b2',  'c1')
    insert into m values('a2',  'b2',  'c2')
    insert into m values('a2',  'b2',  'c3')
    insert into m values('a1',  'b2',  'c4')
    go
    select d = identity(int,1,1) , * into temp from (select distinct a,b from m) t
    select m.*,temp.d from m,temp where m.a = temp.a and m.b = temp.b
    drop table m,temp
    /*
    A          B          C          d           
    ---------- ---------- ---------- ----------- 
    a1         b1         c1         1
    a1         b1         c2         1
    a1         b2         c1         2
    a2         b2         c2         3
    a2         b2         c3         3
    a1         b2         c4         2(所影响的行数为 6 行)*/
    --然后
    select qid,cid,pid,ptid,pbid,ptName,pbName,pName,Model,
      max(case px when 1 then comName else '' end) 'comName1',
      max(case px when 1 then Price else 0 end) 'Price1',
      max(case px when 2 then comName else '' end) 'comName2',
      max(case px when 2 then Price else 0 end) 'Price2',
      max(case px when 3 then comName else '' end) 'comName3',
      max(case px when 3 then Price else 0 end) 'Price3'
    from
    (此处为上面的子查询) t
    group by qid,cid,pid,ptid,pbid,ptName,pbName,pName,Model   
      

  2.   

    declare @tab table(a int,b varchar(2),c int)insert @tab values(7,'aa',153)
    insert @tab values(9,'aa',152)
    insert @tab values(6,'aa',120)
    insert @tab values(8,'aa',168)
    insert @tab values(5,'bb',159)
    insert @tab values(7,'bb',179)
    insert @tab values(8,'bb',149)
    insert @tab values(9,'bb',139)
    insert @tab values(6,'bb',169)这里怎么把原表的数据写进去呢?
    我知道用while begin 但是不知道具体怎么写
    while 到什么条件终止?是先select …… go while 条件 …… begin吗?
      

  3.   

    select px=(select count(1) from @tab where b=a.b and c<a.c)+1 , a,b,c from @tab a
    order by b , c 你使用这句就行了,自己更改对应的字段.上面的数据是测试数据,你不用输入饿.
      

  4.   

    dawugui你好。你给的例子,我看了,不过还有些地方不明白。我也搜了一下相关类型的帖子,好多对我有帮助的基本上都是你回复的。问题一:
    select px=(select count(1) from @tab where b=a.b and c<a.c)+1 , a,b,c from @tab a
    order by b , c 
    中的px是字段么?如果是字段,那么我是不是需要创建一张临时表。这张临时表,我是在原表上增加一个px的字段,还是将原表数据格式化成我要的数据在加上px这个字段呢?问题二:
    你给的例子中表名都是变量,我不知道代码中变量名代表的那个表。=。=问题三:
    max(case px when 1 then comName else '' end) 'comName1',
    max(case px when 1 then Price else 0 end) 'Price1',这2句也不大明白它的意思。sql是我的弱项,所以问题比较白痴=。=这种行转列的情况,思路就是,把数据格式化后写入到临时表,用完了在删除它,是吗?
      

  5.   

    select px=(select count(1) from quote where pid=a.pid and QuotePrice<a.QuotePrice)+1 , qID,cid,pid,QuotePrice,QuoteTime,AddTime,AddPerson,ModPerson
     from quote as a
    order by pid,QuotePricepx          qID         cid         pid         QuotePrice                                            
    ----------- ----------- ----------- ----------- ----------------------------------------------------- 
    1           3           3           6           500.0
    2           6           1           6           1000.0
    3           7           2           6           8000.0
    1           8           1           7           500.0
    2           9           3           7           1000.0
    2           4           2           7           1000.0
    1           10          1           8           1000.0
    2           5           3           8           1500.0
    3           11          2           8           5000.0(所影响的行数为 9 行)第一步出来了,请问后面的代码是怎么回事啊。--然后
    select qid,cid,pid,ptid,pbid,ptName,pbName,pName,Model,
      max(case px when 1 then comName else '' end) 'comName1',
      max(case px when 1 then Price else 0 end) 'Price1',
      max(case px when 2 then comName else '' end) 'comName2',
      max(case px when 2 then Price else 0 end) 'Price2',
      max(case px when 3 then comName else '' end) 'comName3',
      max(case px when 3 then Price else 0 end) 'Price3'
    from
    (此处为上面的子查询) t
    group by qid,cid,pid,ptid,pbid,ptName,pbName,pName,Model   这里(此处为上面的子查询) t是指哪一句的子查询呢?