SQL Server列转行

  • SQL实现列转行
  • UNPIVOT


SQL实现列转行

今天在做一个需求的时候遇到了这个列转行,原因是需要存几个固定列的数据,类似于学生成绩,学科是固定的,分数是不固定的,为了不影响之前已经做好的功能,于是直接就把这几个字段固定到主表了。后面都已经做完了但是临时被通知又要改了,原因就是别的模块在使用的时候希望学科和分数是存在2个字段里面,而不是每个都分开了,这就。。。。。。

sql server如何列转行 sql实现列转行_数据库


但是没办法啊,咱只是个打工的啊,该改还是得改!

如下:

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

运行效果:

sql server如何列转行 sql实现列转行_sql_02


这样得话反正学科是固定的,就算要新增学科那也就是增加一列咯,对于以前做好的模块是不需要改动的,但是突然某个模块的负责人就跟你说,你这样不行的,我后面去取值的时候怎么取,他那边的学科不是固定的,是动态的,这样固定死了他那没法用了,啊?这就。。。。

sql server如何列转行 sql实现列转行_sql_03


没办法勒,打开度娘百度一下列转行,然后就发现了一个方法

UNPIVOT

unpivot 是sql server中用于快速实现列转行的函数。相比于直接通过union来实现列转行,使用unpivot可以让sql语句变得更加简洁。相对而言,理解难度会上升,可读性下降。(摘自度娘)

大道理看下就行,咱这是进行实战的,直接开写:

SELECT name,学科,分数 FROM #USER 
UNPIVOT(学科 FOR 分数 IN(语文,数学,英语))B

运行效果:

sql server如何列转行 sql实现列转行_sql_04


嗯对,这样就完成了,不过数据量大的话不建议用这个方法,这个效率不高,数据量大的时候还是建议建个分表关联一下吧,比这个效率会高的多!

好了,今天的小技巧就分享到这了,别忘了一键三连哦!

sql server如何列转行 sql实现列转行_sql_05