zoukankan      html  css  js  c++  java
  • SQL行列转换

    列转化成行
    --> --> (Roy)生成測試數據

    if not object_id('Class') is null
       
    drop table Class
    Go
    Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)
    Insert Class
    select N'张三',N'语文',78 union all
    select N'张三',N'数学',87 union all
    select N'张三',N'英语',82 union all
    select N'张三',N'物理',90 union all
    select N'李四',N'语文',65 union all
    select N'李四',N'数学',77 union all
    select N'李四',N'英语',65 union all
    select N'李四',N'物理',85
    Go

    动态:

    declare @s nvarchar(4000)
    set @s=''
    Select     @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
    from Class group by[Course]
    exec('select [Student]'+@s+' from Class group by [Student]')


    生成静态:

    select
       
    [Student],
       
    [数学]=max(case when [Course]='数学' then [Score] else 0 end),
       
    [物理]=max(case when [Course]='物理' then [Score] else 0 end),
       
    [英语]=max(case when [Course]='英语' then [Score] else 0 end),
       
    [语文]=max(case when [Course]='语文' then [Score] else 0 end)
    from
        Class
    group by [Student]

    GO

    /*
    Student 数学          物理          英语          语文
    ------- ----------- ----------- ----------- -----------
    李四      77          85          65          65
    张三      87          90          82          78

    (2 行受影响)
    */



    行转化成列
    if not object_id('Class') is null
       
    drop table Class
    Go
    Create table Class([Student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)
    Insert Class
    select N'李四',77,85,65,65 union all
    select N'张三',87,90,82,78
    Go



    动态:

    declare @s nvarchar(4000)
    select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一个union all
    +',[Score]='+quotename(Name)+' from Class'
    from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不转换的列
    order by Colid
    exec('select * from ('+@s+')t order by [Student],[Course]')--增加一个排序

    生成静态:
    select *
    from (select [Student],[Course]='数学',[Score]=[数学] from Class union all
    select [Student],[Course]='物理',[Score]=[物理] from Class union all
    select [Student],[Course]='英语',[Score]=[英语] from Class union all
    select [Student],[Course]='语文',[Score]=[语文] from Class)t
    order by [Student],[Course]

    go

    /*
    Student Course Score
    ------- ------- -----------
    李四      数学      77
    李四      物理      85
    李四      英语      65
    李四      语文      65
    张三      数学      87
    张三      物理      90
    张三      英语      82
    张三      语文      78

    (8 行受影响)
    */
  • 相关阅读:
    张艾迪(创始人):扫清头脑里的尘土继续向前
    张艾迪(创始人):世界最高级创始人
    张艾迪(创始人):发明整个世界+224C个国家
    张艾迪(创始人):发明Global.World.224C的天才
    张艾迪(创始人): 我出现在世界前的那些时光
    张艾迪(创始人):23岁.年少不喜欢浮华的我
    张艾迪(创始人):世界级天才女孩Eidyzhang
    张艾迪(创始人):23岁天才的创业史
    Python基础学习-8
    Python基础学习-7
  • 原文地址:https://www.cnblogs.com/bobofsj11/p/1732715.html
Copyright © 2011-2022 走看看