私は次のデータを持っています
(SQL Server 2005 で) 次の形式に変換するにはどうすればよいですか?
私が思いついた解決策の例がありますが、少しぎこちないようです。もしかして臭い?
DECLARE @ProductLanguage TABLE
(
[PRODUCT_ID] int
, [LANGUAGE] varchar(50)
)
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (52035,'Czech')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (52035,'English')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (52035,'German')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (54001,'Danish')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (54001,'Spanish')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (54001,'English')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (70501,'Finnish')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (70501,'Greek')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (70501,'Hungarian')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (52044,'Hebrew')
SELECT
PRODUCT_ID
,MAX(CASE WHEN [ROW_ID]=1 THEN LANGUAGE ELSE NULL END) As LANG_1
,MAX(CASE WHEN [ROW_ID]=2 THEN LANGUAGE ELSE NULL END) As LANG_2
,MAX(CASE WHEN [ROW_ID]=3 THEN LANGUAGE ELSE NULL END) As LANG_3
FROM
(SELECT
ROW_NUMBER() OVER (PARTITION BY [PRODUCT_ID] ORDER BY [PRODUCT_ID] ASC) AS [ROW_ID]
, [PRODUCT_ID]
, [LANGUAGE]
FROM
@ProductLanguage) AS Temp
GROUP BY
[PRODUCT_ID]
興味深いことに、各 LANG_* 列に表示される特定の言語は気にしません。ここに投稿された他の質問はすべて、ピボットされた列を名前で知ることに言及しているようです。しかし、見つかった言語で列に名前を付けたくありません。
注:「ピボット」という言葉に言及していることは知っていますが、この問題の最善の解決策には PIVOT 句が含まれない場合があります。私の質問がデータのピボットを示唆しているように見えたので、私はその言葉を使用しました。おそらくCTEが解決に役立つでしょうが、私にはわかりません。上記のソリューション例に満足していないことはわかっています。