在SQL Server表中将一行拆分为3行

时间:2015-09-29 14:04:05

标签: sql sql-server sql-server-2008-r2

我想在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

还有其他列,但我需要为每个新行保持相同。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以使用 COUNTY_NAME STATE_NAME STATE_FIPS CNTY_FIPS FIPS Year Boone Illinois 17 007 17007 2010 Bureau Illinois 17 011 17011 2008 Champaign Illinois 17 019 17019 2010 Cook Illinois 17 031 17031 2006

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内投放此字段。

Demo here

答案 1 :(得分:2)

如果结构确实如您在评论中所说的那样固定,那么这将正常工作。

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