Tsql T-SQL Pivot关键字“FOR”附近的语法不正确

Tsql T-SQL Pivot关键字“FOR”附近的语法不正确,tsql,Tsql,我正在学习Datacamp的T-SQL课程,由于某种原因,我不知道如何使用pivot 开始查询是: SELECT CategoryID, AVG(UnitPrice) AS Price FROM Products GROUP BY CategoryID; 结果如下: CategoryID Price ---------------------- 1 37.9791 2 23.0625 3 25.1

我正在学习Datacamp的T-SQL课程,由于某种原因,我不知道如何使用pivot

开始查询是:

SELECT CategoryID, AVG(UnitPrice) AS Price
FROM Products
GROUP BY CategoryID;
结果如下:

CategoryID     Price      
----------------------
1              37.9791
2              23.0625
3              25.1600
4              28.7300
5              20.2500
6              54.0066
7              32.3700
8              20.6825
我想要的结果是:

Per Category        1       2       3       4       5       6       7       8
Average Unit Price  37.98   23.06   25.16   28.73   20.25   54.01   32.37   20.68
我写的代码:

SELECT * 
FROM
    (SELECT CategoryID, AVG(UnitPrice)
     FROM DBO.Products) AS test
PIVOT 
    (UnitPrice 
     FOR CategoryID IN ([1], [2], [3], [4], [5], [6], [7], [8])) AS PivotTable
GROUP BY 
    CategoryID
但是我得到了错误

[42000][Microsoft][ODBC驱动程序17 for SQL Server][SQL Server]关键字“for”附近的语法不正确。156 SQLExecDirectW

我还试过在pivot中使用AVGUnitPrice

然后它生成了以下错误:

[42S22][Microsoft][SQL Server的ODBC驱动程序17][SQL Server]列名“单价”无效。207 SQLExecDirectW

我在这上面已经有一段时间了,我不知道该去哪里找。如果有人能为我指出正确的方向,请提前感谢。

我将通过以下方式删除组:

我将通过以下方式删除该组:


假设产品中的列数多于所示列数,我认为您需要:

SELECT * FROM
(SELECT CategoryID, UnitPrice
FROM DBO.Products) as test
PIVOT (
     AVG(UnitPrice) FOR
     CategoryID IN ([1], [2], [3], [4], [5], [6], [7], [8])
) AS PivotTable

PIVOT隐藏了一个我们不需要重复的显式分组。如果产品仅包含CategoryID和UnitPrice,我们可以直接使用它,而不是使用测试子查询

假设产品中的列多于显示的列,我认为您需要:

SELECT * FROM
(SELECT CategoryID, UnitPrice
FROM DBO.Products) as test
PIVOT (
     AVG(UnitPrice) FOR
     CategoryID IN ([1], [2], [3], [4], [5], [6], [7], [8])
) AS PivotTable
PIVOT隐藏了一个我们不需要重复的显式分组。如果产品只包含CategoryID和UnitPrice,我们可以直接使用它,而不是使用测试子查询

SELECT 'Average Unit Price' AS 'Per Category',   
[1], [2], [3], [4], [5], [6], [7], [8]
FROM  
(SELECT CategoryID, UnitPrice   
    FROM dbo.Products) AS SourceTable  
PIVOT  
(  
AVG(UnitPrice)  
FOR CategoryID IN ([1], [2], [3], [4], [5], [6], [7], [8])
) AS PivotTable;
这项工作:

SELECT 'Average Unit Price' AS 'Per Category',   
[1], [2], [3], [4], [5], [6], [7], [8]
FROM  
(SELECT CategoryID, UnitPrice   
    FROM dbo.Products) AS SourceTable  
PIVOT  
(  
AVG(UnitPrice)  
FOR CategoryID IN ([1], [2], [3], [4], [5], [6], [7], [8])
) AS PivotTable;

除了类别和单价,产品中还有其他栏吗?我希望如此,但只想澄清一下,是的,ProductID ProductName SupplierID CategoryID QuantityPerUnit单价单位库存单位订购再订购级别已停止。除了CategoryID和UnitPrice,产品中还有其他列吗?我希望如此,但只是想澄清一下,是的,ProductID ProductName SupplierID CategoryID QuantityPerUnit单价单位库存单位订单再订购级别已停止。因此,基本上我只需要在透视中使用平均功能,而不是在子查询中使用平均功能。。妈的,谢谢你@MilkTea-是的,正如我所说,PIVOT中有一个隐藏的GroupBy,它基本上是现有结果集中的所有列,除了PIVOT聚合中放置的列。这就是为什么我们需要子查询在尝试数据透视之前删除表中的其他列。很抱歉一直问这个问题,正如我之前所说,我对这个数据透视部分有点陌生。看来我不能用四舍五入把小数四舍五入到2。另外,如何向表中添加名称?如示例所示:每个类别和平均单价?再次感谢。所以基本上我只需要在pivot中使用AVG函数,而不是在子查询中。。妈的,谢谢你@MilkTea-是的,正如我所说,PIVOT中有一个隐藏的GroupBy,它基本上是现有结果集中的所有列,除了PIVOT聚合中放置的列。这就是为什么我们需要子查询在尝试数据透视之前删除表中的其他列。很抱歉一直问这个问题,正如我之前所说,我对这个数据透视部分有点陌生。看来我不能用四舍五入把小数四舍五入到2。另外,如何向表中添加名称?如示例所示:每个类别和平均单价?再次感谢。