这是我使用的代码,结果发布在下面:
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;
我没有要求查询为我提供姓名,有人可以解释一下这个名字'事情中出现了什么?如果我想要显示ProductID
而不是名字,我该如何修改代码?
非常感谢任何帮助或反馈。
答案 0 :(得分:3)
ProductID
将无法显示,因为您在旋转表时将其用作聚合列。仅显示每种颜色的产品ID计数。要查看ProductID
,请删除查询的数据透视部分。 Name
显示在您的最终结果中,因为它存在于您的内部查询中。
透视表会将行更改为列。在您的情况下,红色,蓝色,银色,黑色,黄色,灰色,多色,未着色(在枢轴子句中给出)的行值将更改为列。在这些列的每一列下,将显示表中显示的该颜色的ProductID数和“名称”列中的名称。所以在查询中没有显示单个productIds。内部查询的ProductID
列仅用于计算计数而未显示在最终结果中。
答案 1 :(得分: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
子句。那是因为
(来自Itzik Ben-Gan的T-SQL基础知识)
PIVOT运营商的数据 通过消除隐含地分组分组元素。分组 元素是源表中没有的所有属性 指定为扩散元素或 聚合元素。
要解决您的问题,请不要将ProductId属性放到PIVOT运算符的聚合元素中。 COUNT
任何属性都适用于您的情况。你可以写
PIVOT COUNT(Color) FOR Color IN ...