我目前正在学习T-SQL,我制作了这个用于学习sql和数据库设计的表。目前,我在一个表中的数据看起来像这样:
ProductID AmountOfTypeA AmountOfTypeB AmountOfTypeC some other atributes describing product.... --------- ------------- ------------- ------------- 101 1 2 0 102 0 1 3 103 5 0 0 etc...
我希望规范化这些数据并消除冗余0,其中没有该类型的产品。我用一个列创建了一个新表:' ProductID',' Type'和'金额'并使用Foreign键通过ProductID链接两个表。目前,我正在使用INSERT INTO dbo.tProdTypes (ProductID, Amount) FROM dbo.tProducts
逐列,然后我手动填充'类型'柱。
但是我想知道是否可以在一个查询中执行此操作,特别是将其他表中的一些数据作为一列插入,将一些自定义数据作为第二列插入。此外,我不介意逐列,但如果有办法立即插入所有列,那就太棒了。
答案 0 :(得分:2)
我认为这样的事情会起作用:
INSERT tProdTypes (ProductID, Amount, Type)
SELECT ProductID, AmountOfTypeA, 'TypeA'
FROM tProducts
WHERE AmountOfTypeA > 0
UNION
SELECT ProductID, AmountOfTypeB, 'TypeB'
FROM tProducts
WHERE AmountOfTypeB > 0
UNION
SELECT ProductID, AmountOfTypeC, 'TypeC'
FROM tProducts
WHERE AmountOfTypeC > 0
答案 1 :(得分:1)
你也可以使用UNPIVOT:
;WITH cte AS (
SELECT *
FROM (VALUES
(101, 1, 2, 0),
(102, 0, 1, 3),
(103, 5, 0, 0)
) as t (ProductID, AmountOfTypeA, AmountOfTypeB, AmountOfTypeC)
)
SELECT ProductID, Amount, [Type]
FROM
(SELECT ProductID, AmountOfTypeA AS A, AmountOfTypeB AS B, AmountOfTypeC AS C
FROM cte) p
UNPIVOT
(Amount FOR [Type] IN
(A, B, C)
)AS unpvt;
输出:
ProductID Amount Type
----------- ----------- -----------
101 1 A
101 2 B
101 0 C
102 0 A
102 1 B
102 3 C
103 5 A
103 0 B
103 0 C
(9 row(s) affected)