Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL-寻找代码澄清_Sql Server_Tsql - Fatal编程技术网

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补充了一个解释。