2013-10-02 5 views
-2

Я использую выражение Common Table Expression и функцию PIVOT, чтобы получить количество продуктов, проданных за последние 5 лет, но я получаю сообщение об ошибке. Почему я получаю ошибку ниже?Ошибка SQL Server Pivot и Count

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

Вы используете ProductId столбец в PIVOT - 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;