簡體   English   中英

將 SQL Server 表中的一行拆分為 3 行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM