none
如何实现行转列 RRS feed

  • 问题

  • 把T1转化成T2,如何写sql

    T1

    name  type   sore
    1        A       合格
    1        B        好
    1       C        不好
    2       A        NULL
    2       B        sss
    3       A         mmmm
    3       c         lll

    T2
    name   A              B                C
    1         合格          好            不好
    2         NUll          sss
    3         mmmm    lll

    2010年11月4日 2:06

答案

  • 
    use Tempdb
    go
    --> -->
     
    if not object_id(N'T1') is null
      drop table T1
    Go
    Create table T1([name] int,[type] nvarchar(1),[sore] nvarchar(4))
    Insert T1
    select 1,N'A',N'合格' union all
    select 1,N'B',N'好' union all
    select 1,N'C',N'不好' union all
    select 2,N'A',null union all
    select 2,N'B',N'sss' union all
    select 3,N'A',N'mmmm' union all
    select 3,N'c',N'lll'
    Go
    
    --SQl2005
    Select
      *
    from T1
      PIVOT (MAX([sore]) FOR [type] IN([A],[B],[C])) AS b
      
    --SQL2000
    select
      [name],
      max(case when [type]='A' then [sore] end) as A,
      max(case when [type]='B' then [sore] end) as B,
      max(case when [type]='C' then [sore] end) as C
    from T1
    group by [name]
    
    /*
    name  A  B  C
    1  合格  好  不好
    2  NULL  sss  NULL
    3  mmmm  NULL  lll
    */
    
    
    

    動態寫法參照

    http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html?seed=562318242


    ROY WU(吳熹)
    • 已标记为答案 zuocl 2010年11月4日 4:10
    2010年11月4日 3:45
    版主

全部回复

  • 
    use Tempdb
    go
    --> -->
     
    if not object_id(N'T1') is null
      drop table T1
    Go
    Create table T1([name] int,[type] nvarchar(1),[sore] nvarchar(4))
    Insert T1
    select 1,N'A',N'合格' union all
    select 1,N'B',N'好' union all
    select 1,N'C',N'不好' union all
    select 2,N'A',null union all
    select 2,N'B',N'sss' union all
    select 3,N'A',N'mmmm' union all
    select 3,N'c',N'lll'
    Go
    
    --SQl2005
    Select
      *
    from T1
      PIVOT (MAX([sore]) FOR [type] IN([A],[B],[C])) AS b
      
    --SQL2000
    select
      [name],
      max(case when [type]='A' then [sore] end) as A,
      max(case when [type]='B' then [sore] end) as B,
      max(case when [type]='C' then [sore] end) as C
    from T1
    group by [name]
    
    /*
    name  A  B  C
    1  合格  好  不好
    2  NULL  sss  NULL
    3  mmmm  NULL  lll
    */
    
    
    

    動態寫法參照

    http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html?seed=562318242


    ROY WU(吳熹)
    • 已标记为答案 zuocl 2010年11月4日 4:10
    2010年11月4日 3:45
    版主
  • 寫個SQL2000的動態例子給樓主參照

    declare @s nvarchar(4000)
    set @s='select Name'
    select @s=@s+',['+[type]+']=max(case when [type]=N'''+[type]+''' then [sore] end)' from T1 group by [type]
    exec(@s+' from T1 group by Name')
    


    ROY WU(吳熹)
    2010年11月4日 3:48
    版主
  • 谢谢你!

    很好很强大

    2010年11月4日 4:10