博主『SCscHero』
请选择金额
【5角】
【1元】
【2元】
【闪存】
【首页精华】
【小组】
【新闻】
【博问】
【收藏】
【招聘】
【文库】
【随便看看】
【班级】
【添加新随笔】
【随笔管理】
【文章管理】
【日记管理】
【评论管理】
【标签管理】
【链接管理】
【相册管理】
【文件管理】
【设置】
【选项】
公告板
每一个伟大的成功,都有一个微不足道的开始。
博客速览
博主主页
博客园主页
BiliBili主页
GitHub主页
Weibo主页
CSDN主页
SC2主页
管理
RSS
私信
0浏览0评论
首页/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语法结构如下:

sql-- 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) 数据准备

sql
--示例:员工工资表
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) 行转列实现

sqlSELECT 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即可。

发表评论
  • 贴吧表情
  • QQ高清
  • emoji高清
发表评论修改评论
还没有人评论呢,快来发一条评论吧~
点击右上角即可分享
微信分享提示

Welcome to SCscHero's Blog...