[英]Dynamic SQL Server Pivot Table
我發現了一個很好的腳本,它可以通過我的數據透視表的列名動態創建,但是我沒有將指定的值重新放回到表中。 這是我的起始桌。
ORDER_ID DSC_NAME NAME
----------- --------------- -----------
2 34-1500-XXX DWG_DOC
3 C0403 EQIP_1
4 C4054 EQIP_2
1 34-1500-013 PART
0 88-0000 PRCS
我運行此SQL以在我的數據透視表中生成我想要的列
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct
',' + QUOTENAME(NAME)
FROM test
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
這給了我以下輸出
[DWG_DOC],[EQIP_1],[EQIP_2],[PART],[PRCS]
當我為數據透視表運行動態SQL時
SET @query = 'SELECT ' + @cols + ' from
(
SELECT ORDER_ID,DSC_NAME
FROM test
) x
pivot
(
MIN(ORDER_ID)
for DSC_NAME in (' + @cols + ')
) p '
execute(@query)
我看到這個結果......
DWG_DOC EQIP_1 EQIP_2 PART PRCS
----------- ----------- ----------- ----------- -----------
NULL NULL NULL NULL NULL
我已經嘗試了幾種不同的選擇,但我沒有想出解決方案,為什么這不起作用。
期望的輸出將是ORDER_ID的列順序正確的位置
PRCS PART DWG_DOC EQIP_1 EQIP_2
---------- -------------- -------------- --------- ---------
88-0000 34-1500-013 34-1500-XXX C0403 C4054
但這也適用於我的應用程序。
DWG_DOC EQIP_1 EQIP_2 PART PRCS
-------------- --------- --------- -------------- -----------
34-1500-XXX C0403 C4054 34-1500-013 88-0000
從選擇中刪除ORDER_ID
,然后選擇列name
:
SET @query = 'SELECT ' + @cols + ' from
(
SELECT ORDER_ID, DSC_NAME -- <--- you didn't select the name here
FROM test
) x
pivot
(
MIN(ORDER_ID)
for DSC_NAME in (' + @cols + ')
) p '
並使用MAX(DSC_Name)
代替MIN(ORDER_ID)
。 像這樣:
SET @query = 'SELECT '+ @cols + ' from
(
SELECT DSC_NAME, Name
FROM test
) x
pivot
(
MAX(DSC_Name)
for NAME in (' + @cols + ')
) p ';
這會給你:
| DWG_DOC | EQIP_1 | EQIP_2 | PART | PRCS |
---------------------------------------------------------
| 34-1500-XXX | C0403 | C4054 | 34-1500-013 | 88-0000 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.