5分钟学会SQL SERVER行转列、列转行,PIVOT操作

我是firewang,用技术让数据说话,用数据让你我进化

本文目录:

  PIVOT语法

  PIVOT示例

  UNPIVOT语法

  UNPIVOT示例

  PIVOT和UNPIVOT

PIVOT 通过将表达式中的一个列的唯一值转换为输出中的多列(即行转列),来轮替表值表达式。PIVOT 在需要对最终输出所需的所有剩余列值执行聚合时运行聚合。与 PIVOT 执行的操作相反,UNPIVOT 将表值表达式的列轮换为行(即列转行)。

但是需要注意得是,UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 执行聚合,并将多个可能的行合并为输出中的一行。UNPIVOT 不重现原始表值表达式的结果,因为行已被合并。

-- PIVOT 语法

SELECT <非透视的列>,

    [第一个透视的列] AS <列名称>,

    [第二个透视的列] AS <列名称>,

    ...

    [最后一个透视的列] AS <列名称>,

FROM

    (<生成数据的 SELECT 查询>) 

    AS <源查询的别名>

PIVOT

(

    <聚合函数>(<要聚合的列>)

FOR

[<包含要成为列标题的值的列>]

    IN ( [第一个透视的列], [第二个透视的列],

    ... [最后一个透视的列])

) AS <透视表的别名>

<可选的 ORDER BY 子句>;


实例的数据使用的是和 SQL笔试50题同样的数据, 使用的平台是SQLFIDDLE(提供在线数据库),鉴于近期全球病情的影响,各种网站都有一定几率无法提供服务,本次提供了SQLite数据库,已存入测试数据。

下载地址(13天内有效):https://c-t.work/s/1786d12bba3e4c

-- 查看每个人的年龄,性别,三门课成绩

select

sid,sname,sage,ssex,[语文],[数学],[英语]

from

(

select a.sid,a.sname,a.sage,a.ssex,c.cname,b.score

  from Student a

  left join Score b 

  on a.sid=b.sid

  left join Course c

  on b.cid = c.cid

) source_table

pivot(

  sum(score) for

cname in (

  [语文],[数学],[英语]

)

     ) t

student_pivot

将上述结果新建表 Student_pivot

create table Student_pivot (

sid varchar(10),sname nvarchar(10),sage datetime,ssex nvarchar(10), "语文" int, "数学" int,"英语" int);

insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男', 80, 90, 99);

insert into Student values('02' , N'钱电' , '1990-12-21' , N'男', 70, 60, 80);

insert into Student values('03' , N'孙风' , '1990-05-20' , N'男', 80, 80, 80);

insert into Student values('04' , N'李云' , '1990-08-06' , N'男', 50, 30, 20);

insert into Student values('05' , N'周梅' , '1991-12-01' , N'女', 76, 87, null);

insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女', 31, null, 34);

insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女', null, 89, 98);

insert into Student values('08' , N'王菊' , '1990-01-20' , N'女', null,null,null);


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

Where:

--[columns not unpivoted]: 没有被转换的列名。

--[unpivot_column]: 转换的各列所汇总到的单列的名称。

--[value_column]: 转换的各列数据所汇总到的单列的名称。

--<source query>: 源数据。

--<alias for the source data>: 为源数据转换后的表确定一个别名。

--<column_list>:  被转换的列的各列的名称。

--<alias for unpivot>: 转换操作的整个过程的别名。


然后将这张结果表里的数据UNPIVOT回去。

select 

  sid,

  sname,

  sage,

  ssex,

  subject,

  score

from 

(select * from Student_pivot) as sp

UNPIVOT(

  score for subject in ([语文],[数学],[英语]) 

) as t

特别注意那些成绩为空的行记录都没有出现!


本文项目地址:

https://github.com/firewang/sql50

参考网址:

https://docs.microsoft.com/zh-cn/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15

https://sql50.readthedocs.io/zh_CN/latest/

https://github.com/firewang/sql50

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容