该表中的部分数据如下:
GG(规格)GradeNo(等级)  Ps(片数)
---    -------       ----
5.00     01          1443
5.00     02          66 
5.00     03          69
8.00     01          88 现在我要查询的结果如下:
规格  等级(01)的片数 等级(02)德片数 等级(03)的片数  等级(?)的片数
-----  ----------- ----------    ------------         -------
5.00    1443        66           69                  ?
8.00     88         0             0                   ?
?表示可能还有其他的等级,请问该如何实现这个结果,请大虾指点一下小弟.谢谢

解决方案 »

  1.   

    1.可以直接写:
    select gg,
    case cradeno when '01' then ps end,
    case cradeno when '02' then ps end,
    case cradeno when '03' then ps end,

    from tb
    group by gg
      

  2.   

    普通行列转换假设有张学生成绩表(t)如下    Name Subject Result
        张三 语文  73
        张三 数学  83
        张三 物理  93
        李四 语文  74
        李四 数学  84
        李四 物理  94    想变成 
        姓名 语文 数学 物理
        张三 73  83  93
        李四 74  84  94    create table #t
        (
        Name    varchar(10) ,
        Subject varchar(10) ,
        Result  int
        )    insert into #t(Name , Subject , Result) values('张三','语文','73')
        insert into #t(Name , Subject , Result) values('张三','数学','83')
        insert into #t(Name , Subject , Result) values('张三','物理','93')
        insert into #t(Name , Subject , Result) values('李四','语文','74')
        insert into #t(Name , Subject , Result) values('李四','数学','83')
        insert into #t(Name , Subject , Result) values('李四','物理','93')    declare @sql varchar(8000)
        set @sql = 'select Name as ' + '姓名'
        select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']'
        from (select distinct Subject from #t) as a
        set @sql = @sql + ' from #t group by name'
        exec(@sql)     drop table #t    --结果
        姓名       数学        物理        语文          
        ---------- ----------- ----------- ----------- 
        李四       83          93          74
        张三       83          93          73
     如果上述两表互相换一下:即    姓名 语文 数学 物理
        张三 73  83  93
        李四 74  84  94    想变成     Name Subject Result
        张三 语文  73
        张三 数学  83
        张三 物理  93
        李四 语文  74
        李四 数学  84
        李四 物理  94    create table #t
        (
        姓名 varchar(10) ,
        语文 int ,
        数学 int ,
        物理 int
        )    insert into #t(姓名 , 语文 , 数学 , 物理) values('张三',73,83,93)
        insert into #t(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)    select 姓名 as Name,'语文' as Subject,语文 as Result from #t union
        select 姓名 as Name,'数学' as Subject,数学 as Result from #t union
        select 姓名 as Name,'物理' as Subject,物理 as Result from #t
        order by 姓名 desc     drop table #t
     
        Name       Subject Result      
        ---------- ------- ----------- 
        张三       数学    83
        张三       物理    93
        张三       语文    73
        李四       数学    84
        李四       物理    94
        李四       语文    74    (所影响的行数为 6 行)
      

  3.   

    2.动态:
    DECLARE @s varchar(8000)
    SET @s = ''
    SELECT @s = @s + N',' + QUOTENAME(GradeNo) + N'= SUM(CASE GradeNo WHEN ' + QUOTENAME(GradeNo, '''') + ' THEN Ps END)'
    FROM(
        SELECT DISTINCT GradeNo FROM 表
    )AEXEC('select [规格] = gg' + @s + ' FROM 表 GROUP BY gg')
      

  4.   

    if object_id('pubs..tb') is not null
       drop table tb
    gocreate table tb
    (
    规格 varchar(10),
    等级 varchar(10),
    片数 int
    )insert into tb(规格,等级,片数) values('5.00',     '01',          1443)
    insert into tb(规格,等级,片数) values('5.00',     '02',          66 )
    insert into tb(规格,等级,片数) values('5.00',     '03',          69)
    insert into tb(规格,等级,片数) values('8.00',     '01',          88 )    declare @sql varchar(8000)
        set @sql = 'select 规格'
        select @sql = @sql + ' , sum(case 等级 when ''' + 等级 + ''' then 片数 else 0 end) [' + '等级(' + 等级 + ')的片数]'
        from (select distinct 等级 from tb) as a
        set @sql = @sql + ' from tb group by 规格'
        exec(@sql) drop table tb规格       等级(01)的片数   等级(02)的片数   等级(03)的片数   
    ---------- -----------      -----------      ----------- 
    5.00       1443             66               69
    8.00       88               0                0
      

  5.   


    create table T(GG char(4), GradeNo char(2), ps int)
    insert T select '5.00',     '01',          1443
    union all select '5.00',     '02',          66 
    union all select '5.00',     '03',          69
    union all select '8.00',     '01',          88 declare @sql varchar(8000)
    set @sql='select GG,'
    select @sql=@sql+'[等级('+GradeNo+')的片数]=sum(case when GradeNo='+quotename(GradeNo, '''')+' then ps else 0 end),' from T group by GradeNo
    select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from T group by GG '
    --print @sqlexec(@sql)
    --result
    GG   等级(01)的片数   等级(02)的片数   等级(03)的片数   
    ---- ----------- ----------- ----------- 
    5.00 1443        66          69
    8.00 88          0           0
      

  6.   

    select gg as '规格','等级('+ sum( case GradeNo when '''+GradeNo+''' then ps end )  +')的片数' from table group by gg
      

  7.   

    create table tt(GG decimal(5,2),GradeNo  varchar(10),  Ps int)
    insert into tt select 5.00,'01',1443
    union all select 5.00,     '02',          66 
    union all select 5.00,     '03',          69
    union all select 8.00,     '01',          88 
    DECLARE @s varchar(8000)
    SET @s = ''
    SELECT @s = @s + N',' + QUOTENAME(GradeNo) + N'= SUM(CASE GradeNo WHEN ' + QUOTENAME(GradeNo, '''') + ' THEN Ps END)'
    FROM(
        SELECT DISTINCT GradeNo FROM tt
    )AEXEC('select [规格] = gg' + @s + ' FROM tt GROUP BY gg')drop table tt/**结果规格      01          02          03          
    ------- ----------- ----------- ----------- 
    5.00    1443        66          69
    8.00    88          NULL        NULL
    */