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 行受影响)
    */
  • 相关阅读:
    【Linux 读书笔记】Linux文件的硬连接和符号连接
    Shell参数
    Shellcase语句的例子
    Shellselect
    Shell小程序一个
    SHELL起步
    接昨天的 while
    Shell循环控制
    Shellwhile循环的例子
    Shellfor语句
  • 原文地址:https://www.cnblogs.com/bobofsj11/p/1732715.html
Copyright © 2011-2022 走看看