TSQL - 寻找代码澄清

时间:2016-09-12 04:17:26

标签: sql-server 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而不是名字,我该如何修改代码?

非常感谢任何帮助或反馈。

2 个答案:

答案 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 ...