怎么做一个这样的功能:
数据库中的数据是这样的:
产品名 销售数量
 A       2
 B       3
 C       4
 D       5  
 。      。
 。      。
 。      。
现在我想统计一下他们之间的关系,统计出来的结果如下:
    A    B    C     D 
A   2/2  2/3  2/4   2/5B   3/2  3/3 3/4   3/5C   4/2  4/3 4/4   4/5D   5/2  5/3 5/4   5/5
。 ...
。 ...
。 ...
就是他们之间的连带关系,请高手给各提示?

解决方案 »

  1.   

    --自定义一个聚合函数my_sum
    select 
    my_sum(case when b.产品名='a' then b.产品名 end,a.产品名)[a], 
    my_sum(case when b.产品名='b' then b.产品名 end,a.产品名)[b], 
    my_sum(case when b.产品名='c' then b.产品名 end,a.产品名)[c], 
    my_sum(case when b.产品名='d' then b.产品名 end,a.产品名)[d], 
    my_sum(case when b.产品名='e' then b.产品名 end,a.产品名)[e],
    ...
    from biao a,biao b
    group by a.产品名
      

  2.   

    不好意思,开始以为你的聚合和复杂,原来就是一拼:
    create table test(name varchar(10),num int)
    insert into test select 'A',2
    insert into test select 'B',3
    insert into test select 'C',4
    insert into test select 'D',5select 
    max(case when b.name='a' then cast(a.num as varchar)+'/'+cast(b.num as varchar) end) [a],
    max(case when b.name='b' then cast(a.num as varchar)+'/'+cast(b.num as varchar) end) [b],
    max(case when b.name='c' then cast(a.num as varchar)+'/'+cast(b.num as varchar) end) [c],
    max(case when b.name='d' then cast(a.num as varchar)+'/'+cast(b.num as varchar) end) [d]
    from test a,test b
    group by a.name
      

  3.   

    --结果:
    2/2 2/3 2/4 2/5
    3/2 3/3 3/4 3/5
    4/2 4/3 4/4 4/5
    5/2 5/3 5/4 5/5
    --删除测试:
    drop table test
      

  4.   

    少个了个字段,补一下:
    select a.name,
    max(case when b.name='a' then cast(a.num as varchar)+'/'+cast(b.num as varchar) end) [A],
    max(case when b.name='b' then cast(a.num as varchar)+'/'+cast(b.num as varchar) end) [B],
    max(case when b.name='c' then cast(a.num as varchar)+'/'+cast(b.num as varchar) end) [C],
    max(case when b.name='d' then cast(a.num as varchar)+'/'+cast(b.num as varchar) end) [D]
    from test a,test b
    group by a.name
      

  5.   

    这样算得话,左边的行编号为:1、2、3,能不能变为A、B、C、D
    还有点问题,我现在产品如果很多的话,必须这样一条条的写吗,能不能用循环或者是变量什么的,就是更简单一点的语句?麻烦specialsoldier(雪地撒野)再给讲解讲解。
      

  6.   

    左边的行编号为:1、2、3,能不能变为A、B、C、D
    -----------------
    这个不行  ,行编号只是sql给你显示结果集时辅助数据,并不包括再结果集中.所以改了也没用,也改不了.
    我现在的第一列就可以用了
      

  7.   

    --动态取得你的产品名称作为最后结果集的字段.
    declare @sql varchar(8000),@tbName varchar(40)
    set @tbName = 'test'--这里填你的表名
    set @sql = 'select a.name, '
    select @sql = @sql +' max(case when b.name='''+a.name+''' then cast(a.num as varchar)+''/''+cast(b.num as varchar) end) ['+a.name+'],'
    from (
    select name from test
    group by name
    )a
    set @sql=left(@sql,len(@sql)-1)
    set @sql=@sql+' from '+@tbName+' a,'+@tbName+' b group by a.name'
    --select @sql--查看最终的语句
    exec(@sql)
    -----------测试表还是上面的test,结果相同.
    回去睡觉,下午再来看~
      

  8.   

    使用交叉联接  CROSS JOIN
    没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
    select a=a.销售数量,b.销售数量 from tablename  a cross join (select 销售数量 from tablename) b order by a
      

  9.   

    我想问一下用max()什么意思?
      

  10.   

    动态就是上面我写的,你把test换成你的表名就可以了.max()事指取所选结果集某字段上的最大值此处用max是不得以,其实只选择了一条记录,max()了还是原来的值.但是用了group by之后去了group by后面的字段,其余字段都得包含在类似max(还有min,avg)等的聚合函数中.
      

  11.   


    select max(a)
    from(
    select 1 a union select 2 a union select 3 a)ss
    结果:3
      

  12.   

    再问最后一次,更复杂的看看还有没有办法解决,如果是两张表的相互关系那
           表1                    表2
    产品名 销售数量        产品名 销售数量    
     A       2              甲       4   
     B       3              乙       5
     。      。             。       。
     。      。             。       。
     。      。             。       。看看能不能得到类似上述的效果:
    统计出来的结果如下:
        甲    乙  
    A   2/4  2/5 B   3/4  3/5 
    。 ...
    。 ...
    。 ...
      

  13.   

    一时没有其他处理方式,沿用上面的方式,将表1和表2的数据合并到一张表里,然后用原来的方式处理.否则就在关联的时候(表1,表2)union(表1,表1)union(表2,表2)union(表2,表1),具体处理你招猫画虎吧.