SQL Server列转行
- SQL实现列转行
- UNPIVOT
SQL实现列转行
今天在做一个需求的时候遇到了这个列转行,原因是需要存几个固定列的数据,类似于学生成绩,学科是固定的,分数是不固定的,为了不影响之前已经做好的功能,于是直接就把这几个字段固定到主表了。后面都已经做完了但是临时被通知又要改了,原因就是别的模块在使用的时候希望学科和分数是存在2个字段里面,而不是每个都分开了,这就。。。。。。
但是没办法啊,咱只是个打工的啊,该改还是得改!
如下:
CREATE TABLE #USER(
name NVARCHAR(100),
语文 DECIMAL(18,2),
数学 DECIMAL(18,2),
英语 DECIMAL(18,2)
)
INSERT INTO #USER
(
name,
语文,
数学,
英语
)
VALUES
( '张三', -- name - nvarchar(100)
88, -- 语文 - decimal(18, 2)
89, -- 数学 - decimal(18, 2)
60 -- 英语 - decimal(18, 2)
),( '王二', -- name - nvarchar(100)
78, -- 语文 - decimal(18, 2)
50, -- 数学 - decimal(18, 2)
80 -- 英语 - decimal(18, 2)
)
运行效果:
这样得话反正学科是固定的,就算要新增学科那也就是增加一列咯,对于以前做好的模块是不需要改动的,但是突然某个模块的负责人就跟你说,你这样不行的,我后面去取值的时候怎么取,他那边的学科不是固定的,是动态的,这样固定死了他那没法用了,啊?这就。。。。
没办法勒,打开度娘百度一下列转行,然后就发现了一个方法
UNPIVOT
unpivot 是sql server中用于快速实现列转行的函数。相比于直接通过union来实现列转行,使用unpivot可以让sql语句变得更加简洁。相对而言,理解难度会上升,可读性下降。(摘自度娘)
大道理看下就行,咱这是进行实战的,直接开写:
SELECT name,学科,分数 FROM #USER
UNPIVOT(学科 FOR 分数 IN(语文,数学,英语))B
运行效果:
嗯对,这样就完成了,不过数据量大的话不建议用这个方法,这个效率不高,数据量大的时候还是建议建个分表关联一下吧,比这个效率会高的多!
好了,今天的小技巧就分享到这了,别忘了一键三连哦!