原文:
SQL SERVER特殊行转列案列一则
今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表1的数据转换为表2的显示格式.
我想了一下,给出了一个解决方法,具体如下所示(先给出测试数据)
INSERT
INTO
TEST
SELECT 1, 1, '定型名称' , '预定型' UNION ALL
SELECT 1, 2, '进布方式' , '调平' UNION ALL
SELECT 1, 3, '21米长定型机开机速度' , '25' UNION ALL
SELECT 1, 4, '烘箱温度' , '195' UNION ALL
SELECT 1, 5, '门幅(CM)' , '200-210-210' UNION ALL
SELECT 2, 1, '过软' , 'na' UNION ALL
SELECT 2, 2, '调平' , 'na' UNION ALL
SELECT 2, 3, '25' , '+/-0.5' UNION ALL
SELECT 2, 4, '150' , '+/-5℃头尾烘箱除外' UNION ALL
SELECT 2, 5, '188-198-198' , '+/-3'
实现其功能的SQL语句如下所示
WITH
T
AS
(
SELECT NO , ROW_NUMBER() OVER (PARTITION BY NO ORDER BY STEP) AS ROWID, NAME, VAlUE FROM TEST
)
SELECT NO , MAX (NAME) AS NAME, MAX ( VALUE ) AS VALUE , MAX (NAME2) AS NAME2 , MAX (VALUE2) AS VALUE2
FROM
(
SELECT NO , NAME AS NAME, VALUE AS VALUE , NULL AS NAME2, NULL AS VALUE2 FROM T WHERE ROWID =1
UNION ALL
SELECT NO , NULL AS NAME , NULL AS VALUE , NAME AS NAME2, VALUE AS VALUE2 FROM T WHERE ROWID =2
) TT
GROUP BY NO
但是这样有一个弊端就是同一NO的记录不定(不知道有多少条记录),那么上面SQL语句就不知道怎么写了,好在这个需求每个NO最多只有四条记录,所以可以写成下面. 如果记录数再多的话,这个SQL语句就写的很纠结。暂时也没有想到更好的解决方法。
WITH
T
AS
(
SELECT NO , ROW_NUMBER() OVER (PARTITION BY NO ORDER BY STEP) AS ROWID, NAME, VAlUE FROM TEST
)
SELECT NO , MAX (NAME) AS NAME , MAX ( VALUE ) AS VALUE
, MAX (NAME2) AS NAME2 , MAX (VALUE2) AS VALUE2
, MAX (NAME3) AS NAME3 , MAX (VALUE3) AS VALUE3
, MAX (NAME4) AS NAME4 , MAX (VALUE4) AS VALUE4
FROM
(
SELECT NO , NAME AS NAME , VALUE AS VALUE ,
NULL AS NAME2, NULL AS VALUE2 ,
NULL AS NAME3, NULL AS VALUE3 ,
NULL AS NAME4, NULL AS VALUE4
FROM T WHERE ROWID =1
UNION ALL
SELECT NO , NULL AS NAME , NULL AS VALUE ,
NAME AS NAME2, VALUE AS VALUE2 ,
NULL AS NAME3, NULL AS VALUE3 ,
NULL AS NAME3, NULL AS VALUE4
FROM T WHERE ROWID =2
UNION ALL
SELECT NO , NULL AS NAME , NULL AS VALUE ,
NULL AS NAME2, NULL AS VALUE2 ,
NAME AS NAME3, VALUE AS VALUE3 ,
NULL AS NAME4, NULL AS VALUE4
FROM T WHERE ROWID =3
UNION ALL
SELECT NO , NULL AS NAME , NULL AS VALUE ,
NULL AS NAME2, NULL AS VALUE2 ,
NULL AS NAME3, NULL AS VALUE3 ,
NAME AS NAME4, VALUE AS VALUE4
FROM T WHERE ROWID =4
) TT
GROUP BY NO