原文:
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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
