Sql server TSQL-寻找代码澄清
这是我使用的代码,结果发布在下面:Sql server TSQL-寻找代码澄清,sql-server,tsql,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.ProductCategory
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
而不是名称,如何修改代码
非常感谢您提供的任何帮助或反馈。
ProductID
将不显示,因为您在数据透视表时已将其用作聚合列。仅显示每种颜色的产品Id计数。要查看ProductID
,请删除查询的透视部分Name
显示在最终结果中,因为它位于内部查询中
数据透视表会将行更改为列。在你的情况下,红色、蓝色、银色、Black、黄色、灰色、多色、未着色的行值(如枢轴子句中所给出的)被更改为列。在每一列下,表中该颜色的ProductID计数和“name”列中的名称都会显示出来。因此,查询中没有显示单个ProductID。内部查询的
ProductID
列仅用于计算计数,而不显示在最终结果中。ProductID
将不显示,因为您在数据透视表时将其用作聚合列。仅显示每种颜色的产品Id计数。要查看ProductID
,请删除查询的透视部分Name
显示在最终结果中,因为它位于内部查询中
数据透视表会将行更改为列。在你的情况下,红色、蓝色、银色、Black、黄色、灰色、多色、未着色的行值(如枢轴子句中所给出的)被更改为列。在每一列下,表中该颜色的ProductID计数和“name”列中的名称都会显示出来。因此,查询中没有显示单个ProductID。内部查询的
ProductID
列仅用于计算计数,而不显示在最终结果中。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操作符编写groupby
子句。那是因为
(摘自伊兹克·本·甘的T-SQL基础)
枢轴操作符显示
通过消去隐式地除去分组元素。分组
元素是源表中未包含的所有属性
指定为展开元件或展开元件
聚合元素
要解决您的问题,只需不要将ProductId属性放在PIVOT操作符的聚合元素中<代码>计数任何属性都适用于您的情况。你可以写
PIVOT COUNT(Color) FOR Color IN ...
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操作符编写groupby
子句。那是因为
(摘自伊兹克·本·甘的T-SQL基础)
枢轴操作符显示
通过消去隐式地除去分组元素。分组
元素是源表中未包含的所有属性
指定为展开元件或展开元件
聚合元素
要解决您的问题,只需不要将ProductId属性放在PIVOT操作符的聚合元素中<代码>计数任何属性都适用于您的情况。你可以写
PIVOT COUNT(Color) FOR Color IN ...
这是在您的查询中
选择P.ProductID,PC.Name
,您甚至按Name
订购,我没有请求查询提供我的名称-哦,是的,您这样做了!您正在从一个子查询中执行一个SELECT*
,该子查询中包含SELECT..,PC.Name,…
。。。。这就是你的姓名
栏!当我按ProductID下订单时,我得到了以下错误:无效的列名'ProductID'@marc_s,我也选择了ProductID。为什么它没有出现?因为您没有按ProductID进行分组。因此,pivot聚合函数和表的当前格式都会阻止您获得此结果。首先单独运行PPC语句,看看您的Pivot将使用什么。它在您的查询中选择P.ProductID,PC.Name
,您甚至可以按Name
订购,我没有请求查询提供我的名称-哦,是的,您这样做了!您正在从一个子查询中执行一个SELECT*
,该子查询中包含SELECT..,PC.Name,…
。。。。这就是你的姓名
栏!当我按ProductID下订单时,我得到了以下错误:无效的列名'ProductID'@marc_s,我也选择了ProductID。为什么它没有出现?因为您没有按ProductID进行分组。因此,pivot聚合函数和表的当前格式都会阻止您获得此结果。首先单独运行PPC语句,看看Pivot将使用什么。我将把它留给您,但我也将解释查询的逻辑实现。如果他想在pivot中按ProductID分组……那么,这是行不通的。@clifton_h添加了一个解释。我把它留给你,但我也会解释查询的逻辑实现。如果他想在pivot中按ProductID分组……那么,这是行不通的。@clifton_h补充了一个解释。