TYPE    状态
40A 好
40B 坏
40B 好
40C 好
40A 好现在要显示成
      40A     40B     40C  . 
好     2       1       1
坏     0       1       0
ToTal  2       2       1注意:TYPE中类型很多,只列了3种,如何横向列出type

解决方案 »

  1.   

    use Tempdb
    go
    --> --> 
     
    if not object_id(N'Tempdb..#T') is null
    drop table #T
    Go
    Create table #T([TYPE] nvarchar(3),[状态] nvarchar(10))
    Insert #T
    select N'40A',N'好' union all
    select N'40B',N'坏' union all
    select N'40B',N'好' union all
    select N'40C',N'好' union all
    select N'40A',N'好'
    Go
    DECLARE @s NVARCHAR(4000)
    SET @s=N'select [状态]=isnull([状态],''ToTal'')'
    Select @s=@s+','+QUOTENAME([TYPE])+'=sum(case when [TYPE]='+QUOTENAME([TYPE],'''')+' then 1 else 0 end)' from #T GROUP BY [TYPE]EXEC(@s+N' from #T group by [状态] with rollup;')/*
    状态 40A 40B 40C
    好 2 1 1
    坏 0 1 0
    ToTal 2 2 1
    */
      

  2.   

    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([TYPE] varchar(10),[状态] varchar(10))
    insert [tb]
    select '40A','好' union all
    select '40B','坏' union all
    select '40B','好' union all
    select '40C','好' union all
    select '40A','好'
    declare @s varchar(max)
    set @s=''
    select @s=@s+','+quotename([TYPE])+'=sum(case when [TYPE]='+quotename([TYPE],'''')+' then 1 else 0 end)'
    from [tb] group by[TYPE]
    set @s = 'select isnull([状态],''ToTal'')'+@s+'  from [tb] group by [状态] with ROLLUP'
    exec(@s)
    /*
               40A         40B         40C
    ---------- ----------- ----------- -----------
    好          2           1           1
    坏          0           1           0
    ToTal      2           2           1*/
      

  3.   

    生成的語句格式如下:
    select 
    [状态]=isnull([状态],'ToTal'),
    [40A]=sum(case when [TYPE]='40A' then 1 else 0 end),
    [40B]=sum(case when [TYPE]='40B' then 1 else 0 end),
    [40C]=sum(case when [TYPE]='40C' then 1 else 0 end)
    from #T group by [状态] with rollup;
      

  4.   

    可恶啊啊啊啊啊啊啊啊我的2楼不见了
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([TYPE] varchar(10),[状态] varchar(10))
    insert [tb]
    select '40A','好' union all
    select '40B','坏' union all
    select '40B','好' union all
    select '40C','好' union all
    select '40A','好'
    declare @s varchar(max)
    set @s=''
    select @s=@s+','+quotename([TYPE])+'=sum(case when [TYPE]='+quotename([TYPE],'''')+' then 1 else 0 end)'
    from [tb] group by[TYPE]
    set @s = 'select isnull([状态],''ToTal'')'+@s+'  from [tb] group by [状态] with ROLLUP'
    exec(@s)
    /*
               40A         40B         40C
    ---------- ----------- ----------- -----------
    好          2           1           1
    坏          0           1           0
    ToTal      2           2           1*/
      

  5.   

    select
       isnull(type,'total')
       sum(case type when '40A' then 1 else 0 end) as '40A',
       sum(case type when '40B' then 1 else 0 end) as '40B',
       sum(case type when '40C' then 1 else 0 end) as '40C'
    from
       tb
    group by
       type 
    with rollup
      

  6.   

    create table [tb]([TYPE] varchar(10),[状态] varchar(10))
    insert [tb]
    select '40A','好' union all
    select '40B','坏' union all
    select '40B','好' union all
    select '40C','好' union all
    select '40A','好'
    declare @sql varchar(8000)
    set @sql = 'select isnull(状态,''total'') 状态'
    select @sql = @sql + ' , sum(case TYPE when ''' + TYPE + ''' then 1 else 0 end) [' + TYPE + ']'
    from (select distinct TYPE from tb) as a
    set @sql = @sql + ' from tb group by 状态 with rollup'
    exec(@sql) drop table tb/*
    状态         40A         40B         40C         
    ---------- ----------- ----------- ----------- 
    好          2           1           1
    坏          0           1           0
    total      2           2           1
    */
      

  7.   

    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([TYPE] varchar(10),[状态] varchar(10))
    insert [tb]
    select '40A','好' union all
    select '40B','好' union all
    select '40B','好' union all
    select '40C','好' union all
    select '40A','好'
    declare @s varchar(max)
    set @s=''
    select @s=@s+','+quotename([TYPE])+'=sum(case when [TYPE]='+quotename([TYPE],'''')+' then 1 else 0 end)'
    from [tb] group by[TYPE]
    set @s = 'select isnull([状态],''ToTal'')'+@s+'  from [tb] group by [状态] with ROLLUP'
    exec(@s)--------------------------------------
    好 2 2 1
    ToTal 2 2 1没有坏 0希望
    --------------------------------------
    好 2 2 1
    坏       0       0       0
    ToTal 2 2 1
      

  8.   

    use Tempdb
    go
    --> --> 
     
    if not object_id(N'Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([TYPE] nvarchar(3),[状态] nvarchar(10))
    Insert #T
    select N'40A',N'好' union all
    select N'40B',N'好' union all
    select N'40C',N'好' union all
    select N'40A',N'好'
    Go
    DECLARE @s NVARCHAR(4000)
    SET @s=N'select [状态]=isnull(a.[状态],''ToTal'')'
    Select @s=@s+','+QUOTENAME([TYPE])+'=sum(case when [TYPE]='+QUOTENAME([TYPE],'''')+' then 1 else 0 end)' from #T GROUP BY [TYPE]EXEC(@s+N' from (SELECT cast(N''好''  as nvarchar(50)) AS [状态] UNION ALL SELECT N''坏'') as a left join #T as b on a.[状态]=b.[状态] group by a.[状态] with rollup;')
    /*
    状态 40A 40B 40C
    好 2 1 1
    坏 0 0 0
    ToTal 2 1 1
    */
      

  9.   


    create table [tb]([TYPE] varchar(10),[状态] varchar(10))insert [tb]
    select '40A','好' union all
    select '40B','好' union all
    select '40B','好' union all
    select '40C','好' union all
    select '40A','好'
    declare @s varchar(max)=''select @s=@s+','+quotename([TYPE])+'=sum(case when [TYPE]='+quotename([TYPE],'''')+' then 1 else 0 end)'
    from [tb] group by[TYPE]set @s = 'select isnull([状态],''ToTal'')'+@s+' from (select * from [tb] union all select ''x'',''坏'' union all select ''x'',''好'') t group by [状态] with ROLLUP'exec(@s)           40A         40B         40C
    ---------- ----------- ----------- -----------
    好          2           2           1
    坏          0           0           0
    ToTal      2           2           1(3 row(s) affected)