2016-09-12 144 views
0

這是我使用的代碼,結果被下面貼:TSQL - 尋找代碼澄清

SELECT * 
FROM 
    (SELECT 
     P.ProductID, PC.Name, ISNULL (P.Color, 'uncolored') AS color 
    FROM 
     SalesLT.ProductCategory AS PC 
    JOIN 
     SalesLT.Product AS P ON PC.ProductCategoryID = P.ProductCategoryID 
) AS PPC 
PIVOT 
    (COUNT (ProductID) FOR Color IN ([Red],[Blue],[Silver],[Black],[Yellow],[Grey],[Multi],[Uncolored])) AS pvt 
ORDER BY 
    Name; 

Result

我沒有請求查詢提供了我的名字,可能有人解釋我如何在結果中彈出這個'名字'的東西?如果我想讓ProductID顯示而不是名稱,我如何修改代碼?

任何幫助或反饋,我們將不勝感激。

+3

這是在您的查詢'SELECT P.ProductID,PC.Name'你甚至爲了通過'Name' – scrappedcola

+1

*我沒有請求查詢提供我的名字* - **哦是的,你做到了!**你做一個'SELECT *'從一個子查詢已'選擇..,PC.Name,...'在這....這是你的'Name'列在那裏! –

+0

當我把ORDER BY的ProductID,我收到以下錯誤: 無效的列名稱的ProductID「 – blackknight316

回答

3

ProductID不會出現,因爲你已經把它作爲一個聚合列,而旋轉表。僅顯示每種顏色的產品ID計數。查看ProductID刪除查詢的主要部分。 Name顯示在您的最終結果中,因爲它在您的內部查詢中。

樞轉表更改行列。在你的情況下,紅色,藍色,銀色,黑色,黃色,灰色,多色,無色(如在pivot子句中給出的)行值將更改爲列。在這些列的每一列下,顯示該表中存在的該顏色的產品ID的計數以及「名稱」列中的名稱。因此查詢中沒有顯示單個productIds。內部查詢的ProductID列僅用於計算計數並且不顯示在最終結果中。

+0

我把它留給你,但我也會解釋查詢的邏輯實現。如果他想要通過樞軸內的ProductID進行分組,那麼這將不起作用。 –

+0

@clifton_h補充說明。 –

2

PIVOT只是由SQL Server定義的操作,即使它不是標準的SQL操作。如果沒有PIVOT運營商,你將如何轉發數據?這很容易。爲了簡單起見,讓我們忽略空顏色。

SELECT 
    P.ProductID, PC.Name, 
    COUNT(CASE WHEN P.Color = 'Red' THEN 1 END) AS Red, 
    COUNT(CASE WHEN P.Color = 'Blue' THEN 1 END) AS Blue, 
    ... 
FROM 
    SalesLT.ProductCategory AS PC 
JOIN 
    SalesLT.Product AS P ON PC.ProductCategoryID = P.ProductCategoryID 
GROUP BY P.ProductID, PC.Name; 

PIVOT確實與上述查詢完全相同的操作。您注意到您不需要使用PIVOT運算符編寫GROUP BY子句。這是因爲

(From Itzik Ben-Gan's T-SQL Fundamentals)

The PIVOT operator figures out the grouping elements implicitly by elimination. The grouping elements are all attributes from the source table that were not specified as either the spreading element or the aggregation element.

爲了解決你的問題,只是不要把產品編號屬性PIVOT操作的聚集元素。 COUNT任何屬性都適用於您的情況。你可以寫

PIVOT COUNT(Color) FOR Color IN ...