zoukankan      html  css  js  c++  java
  • MSSQL·UNPIVOT关键字实现行转列

    阅文时长 | 0.74分钟 字数统计 | 1185.6字符
    主要内容 | 1、引言&背景 2、UNPIVOT基本语法结构 3、数据准备&行转列实现 4、声明与参考资料
    『MSSQL·UNPIVOT关键字实现行转列』
    编写人 | SCscHero 编写时间 | 2021/8/14 PM9:27
    文章类型 | 系列 完成度 | 已完成
    座右铭 每一个伟大的事业,都有一个微不足道的开始。

    一、引言&背景   完成度:100%

    a) 应对问题

    UNPIVOT关键字如何实现行转列?

    b) 应对场景

    1. 如图,员工第一季度工资表,实现行转列。以单表的多个字段拆分成多行数据。
    1. 仍适用于多字段存储同级数据的,例如学生成绩表,按学生维度存储各科学习成绩。

    二、UNPIVOT基本语法结构   完成度:100%

    UNPIVOT语法结构如下:

    -- UNPIVOT 语法
    SELECT [columns not unpivoted],
         [unpivot_column],
           [value_column],
    FROM
    (<source query>)
    AS <alias for the source data>
    UNPIVOT ( [value_column] FOR [unpivot_column] IN ( <column_list> ) ) 
       AS <alias for unpivot>
    
    --[columns not unpivoted]: 固定列,即不经过转换的,直接查出来的列。
    --[unpivot_column]: 需要被拆分的列名称。
    --[value_column]: 需要被拆分的列对应的值。
    --<source query>: 数据结果集。
    --<alias for the source data>: 数据结果集别名,必须结构,可省略AS。
    --<column_list>:  需要被拆分的各列的名称。
    --<alias for unpivot>: 行转列过程结果集的别名,必须结构,可省略AS。
    

    三、数据准备&行转列实现   完成度:100%

    a) 数据准备

    
    --示例:员工工资表
    USE SCscHero_001_SSMSCode
    
    CREATE TABLE [dbo].[实战设计_002_PIVOT实现行转列]
    (
        [EID] INT NOT NULL PRIMARY KEY IDENTITY, 
        [EName] NCHAR(10) NULL, 
        [Year] NCHAR(10) NULL,
        [JanuaryMoney] DECIMAL NULL, 
        [FebruaryMoney] DECIMAL NULL, 
        [MarMoney] DECIMAL NULL,
    )
    
    INSERT INTO 实战设计_002_PIVOT实现行转列 VALUES(N'张三', '2021', 10, 0, 90);
    INSERT INTO 实战设计_002_PIVOT实现行转列 VALUES(N'赵四', '2021', 10, 0, 60);
    INSERT INTO 实战设计_002_PIVOT实现行转列 VALUES(N'王五', '2021', 10, 0, 80);
    INSERT INTO 实战设计_002_PIVOT实现行转列 VALUES(N'李六', '2021', 10, 0, 30);
    INSERT INTO 实战设计_002_PIVOT实现行转列 VALUES(N'田七', '2021', 10, 0, NULL);
    INSERT INTO 实战设计_002_PIVOT实现行转列 VALUES(N'速八', '2021', 10, 0, 34);
    INSERT INTO 实战设计_002_PIVOT实现行转列 VALUES(N'玖九', '2021', 10, 0, 8);
    
    

    数据如下图:

    b) 行转列实现

    SELECT T.EID, T.EName, T.Year, --[columns not unpivoted]
        T.Month, --[unpivot_column]
        T.Money --[value_column]
    FROM(SELECT * FROM dbo.实战设计_002_PIVOT实现行转列) AS UP
        UNPIVOT([Money]
                FOR --[value_column]
                [Month] --[unpivot_column] 
                IN([JanuaryMoney], [FebruaryMoney], [MarMoney]) --column_list
        ) AS T;
    

    四、声明与参考资料   完成度:100%

    原创博文,未经许可请勿转载。

    如有帮助,欢迎点赞、收藏、关注。如有问题,请评论留言!如需与博主联系的,直接博客私信SCscHero即可。

  • 相关阅读:
    CentOS 6.5下安装MySQL 5.6.21
    Java文件实时监控Commons-io
    quartz 实例记录
    Quartz任务调度快速入门(转)
    MySQL日期时间函数大全(转)
    struts2 jsp 传参 NullPointerException问题解决
    hibernate cascade=CascadeType.All
    struts2 学习记录 过滤器 国际化
    struts2 struts1.x 区别
    学习 自己的过滤器和监听器
  • 原文地址:https://www.cnblogs.com/SCscHero/p/15145763.html
Copyright © 2011-2022 走看看