[英]How to pivot my data with SQL Server 2005
我有以下數據
如何將其(使用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將為解決方案提供幫助。 我只知道我對上面的示例解決方案不滿意。
您可以使用PIVOT()函數
SELECT P.PRODUCT_ID,
P.Czech,
P.Other languages
FROM TABLE AS T
PIVOT (
AGGREGATE(LANGUAGE) FOR LANGUAGE IN ([Czech], ...)
) AS P
據我所知,如果您沒有明確命名列,那么您將被迫做一些把戲。
未經測試(顯然)。 請參閱: MSDN
這可以通過PIVOT
靜態或動態完成。
靜態版本的列是硬編碼的(請參見SQL Fiddle with Demo ):
select *
from
(
select product_id, language,
'Lang_' + cast(row_number() over(partition by PRODUCT_ID order by language) as varchar(10)) rn
from ProductLanguage
) x
pivot
(
max(language)
for rn in ([Lang_1], [Lang_2], [Lang_3])
) p
動態版本將在運行時獲取列(請參見SQL Fiddle With Demo ):
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Lang_' + cast(row_number() over(partition by PRODUCT_ID order by language) as varchar(10)))
from ProductLanguage
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT PRODUCT_ID, ' + @cols + ' from
(
select product_id, language,
''Lang_'' + cast(row_number() over(partition by PRODUCT_ID order by language) as varchar(10)) rn
from ProductLanguage
) x
pivot
(
max(language)
for rn in (' + @cols + ')
) p '
execute(@query)
create table #ProductLanguage
(
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')
declare @col as varchar(2000)
declare @query as varchar(4000)
--select language ,@col= replace('[Lang_'+str(row_number() over(order by language))+']',' ','') Lang from (select distinct language from #ProductLanguage)p
select @col = stuff((select distinct '],['+language from #ProductLanguage for xml path('')),1,2,'')+']'
print @col
set @query = 'select PRODUCT_ID, '+@col+ ' from #ProductLanguage
pivot (
max(LANGUAGE) for LANGUAGE in ('+@col+')
) pvt'
execute(@query)
這是一個主意...使用Pivot關鍵字...在sql2005中可用
然后,在完成此工作之后,將列名稱作為數據值輸出,將整個sql statemnt嵌入為外部Select語句中的子查詢,在此您將列名稱別名為“ Language1”,“ Language2”等。
Select Z.Arabic as Language1, Z.Botwanese as Language2, etc.
From (Inner Pivot Query Here ) Z
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.