2016-08-30 90 views
0

我正在嘗試在最後兩列上做一個動態數據透視表,我從一張表中取出並加入到另一張表的內容中。我需要將名稱值轉換爲標題字段和值的值,以便在下面相應地填寫。這是我當前的查詢:MS SQL Server中的動態數據透視表

USE Innovate 
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
     + QUOTENAME(NAME) 

FROM (SELECT DISTINCT NAME FROM Innovate.dbo.Table1 WHERE Name IS NOT NULL) AS ATTRIBUTE_NAME 
WHERE Name LIKE 'Suture_-_2nd_Needle_Code' 
OR Name LIKE 'Suture_-_Absorbable' 
OR Name LIKE 'Suture_-_Antibacterial' 
OR Name LIKE 'Suture_-_Armed' 
OR Name LIKE 'Suture_-_Barbed' 
OR Name LIKE 'Suture_-_Brand_Name' 
OR Name LIKE 'Suture_-_C/R_2nd_Needle_Code' 
OR Name LIKE 'Suture_-_C/R_Brand_Name' 
OR Name LIKE 'Suture_-_C/R_length' 
OR Name LIKE 'Suture_-_C/R_Needle_Code' 
OR Name LIKE 'Suture_-_Coating' 
OR Name LIKE 'Suture_-_Dyed' 
OR Name LIKE 'Suture_-_Filament' 
OR Name LIKE 'Suture_-_length_inches' 
OR Name LIKE 'Suture_-_Looped' 
OR Name LIKE 'Suture_-_Material' 
OR Name LIKE 'Suture_-_Needle_Code' 
OR Name LIKE 'Suture_-_Needle_Shape' 
OR Name LIKE 'Suture_-_Needle_Style' 
OR Name LIKE 'Suture_-_Noun' 
OR Name LIKE 'Suture_-_pleget' 
OR Name LIKE 'Suture_-_Popoff' 
OR Name LIKE 'Suture_-_Suture_count' 
OR Name LIKE 'Suture_-_Suture_size' 

--Prepare the PIVOT query using the dynamic 

SET @DynamicPivotQuery = 
    N'SELECT Table1.Primary_Key, Company_Name, Part_Number, Product_Desc, Innovate_Description, ' + @ColumnName + ' 
    FROM Table1 AS P 
    LEFT JOIN Table2 AS A ON P.Primary_Key = A.Primary_Key 
    PIVOT(MAX(A.VALUE) 
      FOR A.NAME IN (' + @ColumnName + ')) AS PVTTable' 

--Execute the Dynamic Pivot Query 
EXECUTE sp_executesql @DynamicPivotQuery 

; 

這是我不斷收到查詢的結果:消息8156, 級別16,狀態1,5號線的列「Primary_Key」指定 多次'PVTTable'。消息4104,級別16,狀態1,行1 多部分標識符「Table1.Primary_Key」無法綁定。

任何人都可以幫助我轉動這些列沒有錯誤信息?我只在代碼中指定了Primary_Key,因此我不知道如何多次指定它以及如何解除綁定。

+0

首先改變Table1.PrimaryKey到P.PrimaryKey:

總之,建立名單爲@ColumnName變量,可以沒有所有的OR的完成。接下來,打印@ColumnName中的內容並將其顯示給我們。 – RBarryYoung

回答

0

你有一些事情與你的PIVOT聲明是有問題的。首先,您試圖引用Table1和Table2的表別名,但這些別名在PIVOT的最終選擇中不可用。Pivot命令有點像外部選擇,並且唯一可用的表別名是樞軸別名。

下一個支點的documenation狀態「您可以使用PIVOT和UNPIVOT關係運算符來改變一個表值表達式到另一個表」https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx)。基本上這意味着你需要一個單一的表格表達式,只有你想要涉及的唯一命名的列被傳遞給PIVOT命令。後面的部分可能是問題,因爲Table1和Table2可能都有一列Primary_Key,所以pivot不理解引用。

要解決您可以移動您的表1 & 2.加入到內部選擇和別名表或建立一個cte並在您的命令中使用cte。這裏是前一種方法:

SET @DynamicPivotQuery = 
    N'SELECT * FROM 
(
SELECT Table1.Primary_Key, Company_Name, Part_Number, Product_Desc, Innovate_Description, ' + @ColumnName + ' 
    FROM Table1 AS P 
    LEFT JOIN Table2 AS A ON P.Primary_Key = A.Primary_Key 
) t 
    PIVOT(MAX(A.VALUE) 
      FOR NAME IN (' + @ColumnName + ')) AS PVTTable' 
+0

馬特,它看起來像你建議的查詢工作,但我遇到了一個問題,因爲在Table1中,所有從Attribute_Name列旋轉的新列標題都無法識別(因爲它們不存在),所以我一直在這些值的錯誤,因爲它們不在該表中。有沒有辦法讓我從連接中提取這些值以使其能夠運行查詢? –

+0

你能否用實際錯誤更新你的文章?如果你的內部查詢中缺少值/註釋,那麼應該讓你的數據透視表中的一列爲NULL。 – Matt

0

與下面的腳本嘗試..

SET @DynamicPivotQuery = 
    N'SELECT P.Primary_Key, Company_Name, Part_Number, Product_Desc, Innovate_Description, ' + @ColumnName + ' 
    FROM Table1 AS P 
    LEFT JOIN Table2 AS A ON P.Primary_Key = A.Primary_Key 
    PIVOT(MAX(A.VALUE) 
      FOR A.NAME IN (' + @ColumnName + ')) AS PVTTable' 

--Execute the Dynamic Pivot Query 
EXECUTE sp_executesql @DynamicPivotQuery 
0

這些名稱值獲得硬編碼來計算@ColumnName變量。

如果這些值無論如何都是硬編碼的,那麼您還可以使用連接來運行數據透視表,而無需構建要執行的SQL語句。

SELECT A.Company_Name, A.Part_Number, A.Product_Desc, A.Innovate_Description, P.* 
FROM (select Primary_Key, Name, Value from Innovate.dbo.Table1) T1 
PIVOT(MAX(VALUE) FOR NAME IN (
    [Suture_-_2nd_Needle_Code], 
    [Suture_-_Absorbable], 
    [Suture_-_Antibacterial], 
    [Suture_-_Armed], 
    [Suture_-_Barbed], 
    [Suture_-_Brand_Name], 
    [Suture_-_C/R_2nd_Needle_Code], 
    [Suture_-_C/R_Brand_Name], 
    [Suture_-_C/R_length], 
    [Suture_-_C/R_Needle_Code], 
    [Suture_-_Coating], 
    [Suture_-_Dyed], 
    [Suture_-_Filament], 
    [Suture_-_length_inches], 
    [Suture_-_Looped], 
    [Suture_-_Material], 
    [Suture_-_Needle_Code], 
    [Suture_-_Needle_Shape], 
    [Suture_-_Needle_Style], 
    [Suture_-_Noun], 
    [Suture_-_pleget], 
    [Suture_-_Popoff], 
    [Suture_-_Suture_count], 
    [Suture_-_Suture_size] 
) 
) P 
LEFT JOIN Innovate.dbo.Table2 AS A ON (A.Primary_Key = P.Primary_Key); 

很公平,這有一個缺點,即如果該[Primary_Key]需要爲第一列,即P.*應由那些文字列值來代替。畢竟,或者使用EXEC方法。

DECLARE @ColumnName NVARCHAR(MAX); 
--Get distinct values of the PIVOT Column 
SELECT @ColumnName = ISNULL(@ColumnName + ',','') + QUOTENAME(NAME) 
FROM Innovate.dbo.Table1 
WHERE Name Like 'Suture_-_%' 
AND SUBSTRING(Name,10,30) IN (
'2nd_Needle_Code', 
'Absorbable', 
'Antibacterial', 
'Armed', 
'Barbed', 
'Brand_Name', 
'C/R_2nd_Needle_Code', 
'C/R_Brand_Name', 
'C/R_length', 
'C/R_Needle_Code', 
'Coating', 
'Dyed', 
'Filament', 
'length_inches', 
'Looped', 
'Material', 
'Needle_Code', 
'Needle_Shape', 
'Needle_Style', 
'Noun', 
'pleget', 
'Popoff', 
'Suture_count', 
'Suture_size') 
GROUP BY Name; 
+0

第一個代碼很好用,因爲我可以交換硬編碼的值,並且無論如何我都會自己指定它們,而不是使用sql來獲取動態數據透視表中的值。謝謝! –