[英]Split one row into 3 rows in a SQL Server table
我想根據 Win7 上的 SQL Server 2008 R2 中的給定表創建一個新表。
給定表:
id1 id2 valueA valueB valueC
-----------------------------------
dva 365 63213 3879 605
我需要一張桌子:
id1 id2 valueA valueB valueC
-------------------------------------
dva 365_A 63213 0 0
dva 365_B 0 3879 0
dva 365_C 0 0 605
還有其他列,但我需要為每個新行保持它們相同。
任何幫助,將不勝感激。
您可以使用UNION ALL
:
SELECT id1, CONCAT(id2, '_A'), valueA, 0 AS valueB, 0 AS valueC
FROM mytable
UNION ALL
SELECT id1, CONCAT(id2, '_B'), 0, valueB, 0
FROM mytable
UNION ALL
SELECT id1, CONCAT(id2, '_C'), 0, 0, valueC
FROM mytable
根據id2
的日期類型,您可能需要在CONCAT
轉換此字段。
如果結構真的像您在評論中所說的那樣固定,這將正常工作。
DECLARE @Test TABLE
(
id1 VARCHAR(10)
, id2 VARCHAR(10)
, valueA FLOAT
, valueB FLOAT
, valueC FLOAT
);
INSERT INTO @Test (id1, id2, valueA, valueB, valueC)
VALUES ('dva', 365, 63213, 3879, 605);
SELECT id1
, CASE TT.RowNo
WHEN 1 THEN id2 + '_A'
WHEN 2 THEN id2 + '_B'
WHEN 3 THEN id2 + '_C'
END AS id2
, CASE TT.RowNo
WHEN 1 THEN valueA
ELSE 0
END AS valueA
, CASE TT.RowNo
WHEN 2 THEN valueB
ELSE 0
END AS valueB
, CASE TT.RowNo
WHEN 3 THEN valueC
ELSE 0
END AS valueC
FROM @Test AS T
CROSS JOIN (VALUES (1), (2), (3)) AS TT(RowNo);
CROSS JOIN
會將您的行乘以 3,然后您可以簡單地使用CASE語句來應用所需的邏輯。
輸出:
id1 id2 valueA valueB valueC
----------------------------------
dva 365_A 63213 0 0
dva 365_B 0 3879 0
dva 365_C 0 0 605
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.