我想在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
还有其他列,但我需要为每个新行保持相同。
任何帮助都将不胜感激。
答案 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
内投放此字段。
答案 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