2016-04-01 21 views
1

現在T-SQLを学習しています。このテーブルを作成してSQLとデータベースの設計を学習しました。私は、このデータを正規化し、そのタイプのない製品がない場合に冗長0を排除したい新しいデータを別の列に挿入しながら、一方のテーブルのデータを別のテーブルに挿入する

 
ProductID  AmountOfTypeA AmountOfTypeB AmountOfTypeC some other atributes 
                   describing product.... 
---------  ------------- ------------- ------------- 
101   1    2    0 
102   0    1    3 
103   5    0    0 

etc... 

:現時点では私はこのようになりますつのテーブル内のデータを持っています。 「ProductID」、「Type」、「Amount」という列を持つ新しいテーブルを作成し、ForeignIDを使用して2つのテーブルをProductIDでリンクしました。現時点では、私は列ごとにINSERT INTO dbo.tProdTypes (ProductID, Amount) FROM dbo.tProductsを使用して行くつもりですし、手動で 'タイプ'の列に入力します。

しかし、1つのクエリとして他のテーブルのデータを1つの列として挿入し、カスタムデータを第2の列として挿入することは可能でしょうか。また、私は列ごとに気にしませんが、一度にすべての列を挿入する方法があればそれは素晴らしいでしょう。

答えて

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 
+0

私は何をする 'UNION'を使用するのではと思ったことはありませんこの。私はそれがずっと難しいと思った。ありがとう。 – Pawel

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) 
+0

あなたの答えをありがとう、私はまだピボットを完全に理解していないと 'UNION'を使用することは非常に簡単です。しかし、確かに私はそれを試してみましょう。ありがとう。 – Pawel

関連する問題