表一:cjsc 字段:grname(姓名) ,wlbm(物品),dqgx(物品属性) ,sl(数量) ,czlx(类型)grname(姓名) ,wlbm(物品),dqgx(物品属性) ,sl(数量) ,czlx(类型) 
我               铅笔              x           1              买入
我               铅笔              x           3              买入
我               铅笔              y           2              损坏
我               钢笔              x           4              买入
他               铅笔              y           1              损坏
他               钢笔              y           2              买入
要求实现:
姓名           物品           物品属性         买入数量   损坏数量
我              钢笔             x                4             0我              铅笔             x                4             0
我              铅笔             y                0             2
他              钢笔             y                1             2

解决方案 »

  1.   

    select grname,wlbm,dqgx,
      sum(case when czlx = '买入' else sl else 0 end) '买入数量',
      sum(case when czlx = '损坏' else sl else 0 end) '损坏数量'
    from 表一
    group by grname,wlbm,dqgx
      

  2.   

    --上为类型固定为买入,损坏的情况.
    --下为类型不固定的情况.
    declare @sql varchar(8000)
    set @sql = 'select grname,wlbm,dqgx'
    select @sql = @sql + ' , sum(case czlx when ''' + czlx + ''' then sl else 0 end) [' + czlx + '数量]'
    from (select distinct czlx from 表一) as a
    set @sql = @sql + ' from 表一 group by grname,wlbm,dqgx'
    exec(@sql)
      

  3.   

    create table tb (grname varchar(10),wlbm varchar(10),dqgx varchar(10),sl int,czlx varchar(10))
    insert into tb values('我',               '铅笔',              'x',           1,              '买入')
    insert into tb values('我',               '铅笔',              'x',           3,              '买入')
    insert into tb values('我',               '铅笔',              'y',           2,              '损坏')
    insert into tb values('我',               '钢笔',              'x',           4,              '买入')
    insert into tb values('他',               '铅笔',              'y',           1,              '损坏')
    insert into tb values('他',               '钢笔',              'y',           2,              '买入')
    go
    --静态SQL
    select grname,wlbm,dqgx,
      sum(case when czlx = '买入' then sl else 0 end) '买入数量',
      sum(case when czlx = '损坏' then sl else 0 end) '损坏数量'
    from tb
    group by grname,wlbm,dqgx
    --动态SQL
    declare @sql varchar(8000)
    set @sql = 'select grname,wlbm,dqgx'
    select @sql = @sql + ' , sum(case czlx when ''' + czlx + ''' then sl else 0 end) [' + czlx + '数量]'
    from (select distinct czlx from tb) as a
    set @sql = @sql + ' from tb group by grname,wlbm,dqgx'
    exec(@sql)drop table tb/*
    grname     wlbm       dqgx       买入数量        损坏数量        
    ---------- ---------- ---------- ----------- ----------- 
    他          钢笔         y          2           0
    他          铅笔         y          0           1
    我          钢笔         x          4           0
    我          铅笔         x          4           0
    我          铅笔         y          0           2(所影响的行数为 5 行)grname     wlbm       dqgx       买入数量        损坏数量        
    ---------- ---------- ---------- ----------- ----------- 
    他          钢笔         y          2           0
    他          铅笔         y          0           1
    我          钢笔         x          4           0
    我          铅笔         x          4           0
    我          铅笔         y          0           2
    */
      

  4.   

    dawugui(潇洒老乌龟) 
    >>>>>>>>>>>
    你的答案不对哦