У меня есть следующие данные
Как мне преобразовать его (с 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», но лучшее решение этой проблемы может не включать предложение PIVOT. Я просто использовал это слово, поскольку мой вопрос, казалось, предлагал сводить данные.
Может быть, CTE поможет с решением, я не знаю. Я просто знаю, что не доволен приведенным выше примером решения.