2013-10-02 63 views
-2

我正在使用公用表表达式和PIVOT函数来计算过去5年内出售的产品的数量,但我收到错误消息。为什么我得到下面的错误?SQL Server数据透视表和计数函数错误

USE ADVENTUREWOKS2012; 

WITH SALESDATA AS 
(
    SELECT 
     Product.PRODUCTID, 
     Product.Name, 
     YEAR(OrderDate) AS [YEAR SOLD] 
    FROM Purchasing.PurchaseOrderDetail 
    JOIN Production.Product 
     ON Product.ProductID = PurchaseOrderDetail.ProductID 
    JOIN Purchasing.PurchaseOrderHeader 
     ON PurchaseOrderDetail.PurchaseOrderID = PurchaseOrderHeader.PurchaseOrderID 
    GROUP BY Product.PRODUCTID,Product.Name,YEAR(OrderDate) 
) 
SELECT Name, 
    [2005], 
    [2006], 
    [2007], 
    [2008], 
    [2009], 
    PRODUCTID 
FROM SALESDATA 
PIVOT (COUNT(PRODUCTID) FOR [YEAR SOLD] IN ([2005], [2006], [2007], [2008], [2009])) AS P; 

错误:

Msg 207, Level 16, State 1, Line 21 Invalid column name 'PRODUCTID'.

回答

1

您正在使用的PIVOT的ProductId列 - count(productId),所以你不能引用列在最后的选择列表。如果你想引用它,然后改变你的查询,其中包括两次列,因此您可以保持它在最终选择:

WITH SALESDATA AS 
(
    SELECT 
     pivProd = Product.PRODUCTID, 
     Product.PRODUCTID, 
     Product.Name, 
     YEAR(OrderDate) AS [YEAR SOLD] 
    FROM Purchasing.PurchaseOrderDetail 
    JOIN Production.Product 
     ON Product.ProductID = PurchaseOrderDetail.ProductID 
    JOIN Purchasing.PurchaseOrderHeader 
     ON PurchaseOrderDetail.PurchaseOrderID = PurchaseOrderHeader.PurchaseOrderID 
    GROUP BY Product.PRODUCTID,Product.Name,YEAR(OrderDate) 
) 
SELECT Name, 
    [2005], 
    [2006], 
    [2007], 
    [2008], 
    [2009], 
    PRODUCTID 
FROM SALESDATA 
PIVOT 
(
    COUNT(pivProd) FOR [YEAR SOLD] IN ([2005], [2006], [2007], [2008], [2009]) 
) AS P; 

或者只是从最终删除选择:

WITH SALESDATA AS 
(
    SELECT 
     Product.PRODUCTID, 
     Product.Name, 
     YEAR(OrderDate) AS [YEAR SOLD] 
    FROM Purchasing.PurchaseOrderDetail 
    JOIN Production.Product 
     ON Product.ProductID = PurchaseOrderDetail.ProductID 
    JOIN Purchasing.PurchaseOrderHeader 
     ON PurchaseOrderDetail.PurchaseOrderID = PurchaseOrderHeader.PurchaseOrderID 
    GROUP BY Product.PRODUCTID,Product.Name,YEAR(OrderDate) 
) 
SELECT Name, 
    [2005], 
    [2006], 
    [2007], 
    [2008], 
    [2009] 
FROM SALESDATA 
PIVOT 
(
    COUNT(PRODUCTID) FOR [YEAR SOLD] IN ([2005], [2006], [2007], [2008], [2009]) 
) AS P;