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

    --行列互转
    /*
    *****************************************************************************************************************************************************
    以学生成绩为例子,比较形象易懂
    *****************************************************************************************************************************************************
    */

    --1、行互列
    --
    > --> 生成測試數據

    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
    --2000方法:
    动态:

    DECLARE @s NVARCHAR(4000)
    SET @s = ''
    SELECT @s = @s + ',' + QUOTENAME([Course]) + '=sum(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], [数学] = SUM(CASE WHEN [Course] = '数学' THEN [Score]
    ELSE 0
    END),
    [物理] = SUM(CASE WHEN [Course] = '物理' THEN [Score]
    ELSE 0
    END), [英语] = SUM(CASE WHEN [Course] = '英语' THEN [Score]
    ELSE 0
    END),
    [语文] = SUM(CASE WHEN [Course] = '语文' THEN [Score]
    ELSE 0
    END)
    FROM Class
    GROUP BY [Student]

    GO
    动态:

    DECLARE @s NVARCHAR(4000)
    SELECT @s = ISNULL(@s + ',', '') + QUOTENAME([Course])
    FROM Class
    GROUP BY [Course]
    EXEC('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')

    生成静态:
    SELECT *
    FROM Class PIVOT
    ( SUM([Score]) FOR [Course] IN ( [数学], [物理], [英语], [语文] ) ) b

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

    (2 行受影响)
    */

    ------------------------------------------------------------------------------------------
    go
    --加上总成绩(学科平均分)

    --2000方法:
    动态:

    DECLARE @s NVARCHAR(4000)
    SET @s = ''
    SELECT @s = @s + ',' + QUOTENAME([Course]) + '=sum(case when [Course]='
    + QUOTENAME([Course], '''') + ' then [Score] else 0 end)'
    FROM Class
    GROUP BY [Course]
    EXEC('select [Student]'+@s+',[总成绩]=sum([Score]) from Class group by [Student]')
    --加多一列(学科平均分用avg([Score]))

    生成动态:

    SELECT [Student], [数学] = SUM(CASE WHEN [Course] = '数学' THEN [Score]
    ELSE 0
    END),
    [物理] = SUM(CASE WHEN [Course] = '物理' THEN [Score]
    ELSE 0
    END), [英语] = SUM(CASE WHEN [Course] = '英语' THEN [Score]
    ELSE 0
    END),
    [语文] = SUM(CASE WHEN [Course] = '语文' THEN [Score]
    ELSE 0
    END), [总成绩] = SUM([Score]) --加多一列(学科平均分用avg([Score]))
    FROM Class
    GROUP BY [Student]

    go

    --2005方法:

    动态:

    DECLARE @s NVARCHAR(4000)
    SELECT @s = ISNULL(@s + ',', '') + QUOTENAME([Course])
    FROM Class
    GROUP BY [Course]
    --isnull(@s+',','') 去掉字符串@s中第一个逗号
    EXEC('select [Student],'+@s+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a
    pivot (sum([Score]) for [Course] in(
    '+@s+'))b ')

    生成静态:

    SELECT [Student], [数学], [物理], [英语], [语文], [总成绩]
    FROM ( SELECT * ,
    [总成绩] = SUM([Score]) OVER ( PARTITION BY [Student] )
    FROM Class
    ) a --平均分时用avg([Score])
    PIVOT
    ( MAX([Score]) FOR [Course] IN ( [数学], [物理], [英语], [语文] ) ) b

    生成格式:

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

    (2 行受影响)
    */

    go

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

    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

    --2000:

    动态:

    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
    --2005:

    动态:

    DECLARE @s NVARCHAR(4000)
    SELECT @s = ISNULL(@s + ',', '') + QUOTENAME(Name)
    FROM syscolumns
    WHERE ID = OBJECT_ID('Class')
    AND Name NOT IN ( 'Student' )
    ORDER BY Colid
    EXEC('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')

    go
    SELECT Student, [Course], [Score]
    FROM Class UNPIVOT
    ( [Score] FOR [Course] IN ( [数学], [物理], [英语], [语文] ) ) b

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

    (8 行受影响)
    */
  • 相关阅读:
    WP7编译问题:The application could not be launched for debugging
    cocos2dxnaTweeJump学习笔记1(都是自己看别人代码后所感所想,希望有懂的人指出我的错误或者大家交流交流)
    判断datatalbe是否为空
    SOAP协议基础(转自Ksxs's )
    那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable(转)
    MyEclipse中 智能提示 JSP 页面的html 标记属性值
    MyEclipse中设置智能提示
    MyEclipse快捷键大全
    向朋友借钱:文章值得一读,让人思索良久
    生存逼着我成功
  • 原文地址:https://www.cnblogs.com/ToddLai/p/2287365.html
Copyright © 2011-2022 走看看