违法时间     数据类型    数量  用户名
2006-10-1     A          100   ld
2006-10-1     B          20    ld
2006-10-1     C          40    ld
2006-10-1     D          10    ld
2006-10-2     A          120   ld
2006-10-2     B          60    ld
2006-10-2     C          70    ld
2006-10-2     D          70    ld
能否转换成如下格式:
违法时间     数据类型A   数据类型B   数据类型C 数据类型D 用户名
2006-10-1    100         20           40        10        ld
2006-10-2    120         60           70        70        ld不用游标,我想直接用sql语句转换

解决方案 »

  1.   

    select 违法时间,sum(case when 数据类型='A' then 数据类型 else 0 end) as 数据类型A,
    sum(case when 数据类型='B' then 数据类型 else 0 end) as 数据类型B,
    sum(case when 数据类型='C' then 数据类型 else 0 end) as 数据类型C,
    sum(case when 数据类型='D' then 数据类型 else 0 end) as 数据类型D,
    用户名
    from table
    group by 违法时间,用户名
      

  2.   

    declare @t table(违法时间 smalldatetime, 数据类型 varchar(4),   数量 int , 用户名 varchar(5))insert @t select '2006-10-1 '  , 'A',100 ,  'ld'
    insert @t select '2006-10-1'  ,  'B' , 20  , 'ld'
    insert @t select '2006-10-1'  ,  'C' , 40 ,   'ld'
    insert @t select '2006-10-1'  ,  'D' , 120 , 'ld'
    insert @t select '2006-10-2'   ,  'B' ,60  ,  'ld'
    insert @t select '2006-10-2'  ,  'C'  , 70   , 'ld'
    insert @t select '2006-10-2'   , 'D' , 70    ,'ld'
    select 违法时间,sum(case when 数据类型='A' then 数量 else 0 end) as 数据类型A,sum(case when 数据类型='B' then 数量 else 0 end) as 数据类型D
    ,sum(case when 数据类型='C' then 数量 else 0 end) as 数据类型C
    ,sum(case when 数据类型='D' then 数量 else 0 end) as 数据类型B
    from @t
    group by 违法时间
    --------------------------
    违法时间     数据类型A   数据类型B   数据类型C 数据类型D 用户名
    2006-10-01 00:00:00 100 20 40 120
    2006-10-02 00:00:00 0 60 70 70顺便问一句,你是不是在公安局上班啊?
      

  3.   

    其实用动态SQL语句为更好一些~
      

  4.   

    decalre @sql varchar(8000)
    set @sql=''
    select @sql=@sql+',sum(case 数据类型 when '''+数据类型+''' then 数量 esle 0 end)'
       + ' as 数据类型'+数据类型 from yourtable group by 数据类型
    exec('select 违法时间+@sql+',用户名 from yourtable group by 违法时间,用户名')
      

  5.   

    我上面的最后一句为exec('select 违法时间'+@sql+',用户名 from yourtable group by 违法时间,用户名',少打了一个单引号
      

  6.   

    create  table ta(time varchar(10),type varchar(2),num int ,name varchar(2))
    insert ta
    select '2006-10-1',     'A',          100 ,  'ld' union all
    select '2006-10-1',     'B',          20  ,  'ld' union all
    select '2006-10-1',     'C',          40  ,  'ld' union all
    select '2006-10-1',     'D',          10  ,  'ld' union all
    select '2006-10-2',    'A',          120  , 'ld'  union all
    select '2006-10-2',    'B',          60   , 'ld'  union all
    select '2006-10-2',     'C',         70  ,  'ld'  union all
    select '2006-10-2',    'D',          70  ,  'ld'
    declare @sql varchar(1000)
    set @sql=''
    select @sql=@sql+',[数据类型'+type+']=sum( case type when '''+type+''' then num else 0 end)'
    from # group by type
    --print @sql
    set @sql='select time,name '+@sql+' from ta group by time,name' 
    exec(@sql)
    结果:
    time       name 数据类型A       数据类型B       数据类型C       数据类型D       
    ---------- ---- ----------- ----------- ----------- ----------- 
    2006-10-1  ld   100         20          40          10
    2006-10-2  ld   120         60          70          70
      

  7.   

    create  table ta(time varchar(10),type varchar(2),num int ,name varchar(2))
    insert ta
    select '2006-10-1',     'A',          100 ,  'ld' union all
    select '2006-10-1',     'B',          20  ,  'ld' union all
    select '2006-10-1',     'C',          40  ,  'ld' union all
    select '2006-10-1',     'D',          10  ,  'ld' union all
    select '2006-10-2',    'A',          120  , 'ld'  union all
    select '2006-10-2',    'B',          60   , 'ld'  union all
    select '2006-10-2',     'C',         70  ,  'ld'  union all
    select '2006-10-2',    'D',          70  ,  'ld'declare @sql varchar(1000)
    set @sql=''
    select @sql=@sql+',[数据类型'+type+']=sum( case type when '''+type+''' then num else 0 end)'
    from ta group by type--上一个语名的#临时表改为ta 
    --print @sql
    set @sql='select time,name '+@sql+' from ta group by time,name' 
    exec(@sql)
    time       name 数据类型A       数据类型B       数据类型C       数据类型D       
    ---------- ---- ----------- ----------- ----------- ----------- 
    2006-10-1  ld   100         20          40          10
    2006-10-2  ld   120         60          70          70
      

  8.   

    drop table T
    create table T
    (
    违法时间     varchar(10),
    数据类型     varchar(10),
    数量   int ,
    用户名 varchar(10)
    )insert into T
    select '2006-10-1',     'A',          100,   'ld' union all 
    select '2006-10-1',     'B',          20,    'ld' union all 
    select '2006-10-1',     'C',          40,    'ld' union all 
    select '2006-10-1',     'D',          10,    'ld' union all 
    select '2006-10-2',     'A',          120,   'ld' union all 
    select '2006-10-2',     'B',          60,    'ld' union all 
    select '2006-10-2',     'C',          70,    'ld' union all 
    select '2006-10-2',     'D',          70,    'ld'declare @sql varchar(6000)
    set @sql = 'select 违法时间 , '
    select @sql =@sql + 'sum(case when 数据类型 ='''+数据类型+''' then 数量 else 0 end  )as 数据类型'+数据类型+','
    from T group by 数据类型set @sql =@sql + '用户名 from T group by 用户名,违法时间  '
    print @sql exec(@sql)违法时间       数据类型A       数据类型B       数据类型C       数据类型D       用户名        
    ---------- ----------- ----------- ----------- ----------- ---------- 
    2006-10-1  100         20          40          10          ld
    2006-10-2  120         60          70          70          ld(所影响的行数为 2 行)