select col1,sum(生产部),sum(财务部),sum(计划部) from (
select col1,生产部=(case when col2='生产部' then col3 else 0 end),
   财务部=(case when col2='财务部' then col3 else 0 end),
   计划部=(case when col2='计划部' then col3 else 0 end) from yourtablename) c
偶只会简单的

解决方案 »

  1.   

    create table #t (序号 int,商品代码 varchar(10),领用部门 varchar(10),数量 int)
    insert #t select
    1,   '01.01' ,  '生产部' , 100
    union select 2,   '01.02',   '生产部',  200
    union select 3,   '01.01',   '生产部' , 300
    union select 4 ,  '01.03' ,  '生产部' , 50
    union select 5 ,  '01.02' ,  '财务部' , 30
    union select 6 ,  '01.07' ,  '计划部' , 100declare @s varchar(8000)
    set @s=''
    select @s=@s+'sum(case when 领用部门='''+领用部门+''' then 数量 else 0 end) ['
                +领用部门+'] , ' from #t group by 领用部门
    select @s='select 商品代码, '+left(@s,len(@s)-2)+' from #t group by 商品代码'
    exec(@s)
     
    drop table #t
      

  2.   


    create table abc (序号 int,商品代码 char(10),领用部门 varchar(20),数量 int)
    insert abc select 1,'01.01','生产部',100
    union select 2,'01.02','生产部',200
    union select 3,'01.01','生产部',300
    union select 4,'01.03','生产部',50
    union select 5,'01.02','财务部',30
    union select 6,'01.07','计划部',100--测试数据
    SELECT 商品代码, 
        SUM(CASE 领用部门 WHEN '生产部' THEN 数量 ELSE 0 END) AS 生产部,
        SUM(CASE 领用部门 WHEN '财务部' THEN 数量 ELSE 0 END) AS 财务部,
        SUM(CASE 领用部门 WHEN '计划部' THEN 数量 ELSE 0 END) AS 计划部
    FROM hou.dbo.abc
    GROUP BY 商品代码
    GO
    --测试结果01.01      400 0 0
    01.02      200 30 0
    01.03      50 0 0
    01.07      0 0 100
      

  3.   

    谢谢 zheninchangjiang(john shu),PPLUNCLE(人是逼出来的!)
         victorycyz(中海),javahou(岩珂)我想问一下,用case的话,如果数据量很大的话,会不会影响速度?谢谢。
      

  4.   

    1.数据量大时肯定影响速度.2.领用部门不固定时,只能用动态语句.3.这样的交叉表一般在前台程序中有专门的控件处理,而不是用SQL语句直接生成