【问题标题】:SQL Server Pivot and Count Function ErrorSQL Server 透视和计数函数错误
【发布时间】:2013-10-09 01:39:18
【问题描述】:

我正在使用公用表表达式和 PIVOT 函数来获取过去 5 年销售的产品数量,但出现错误。为什么会出现以下错误?

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;

错误:

消息 207,第 16 级,状态 1,第 21 行 列名“PRODUCTID”无效。

【问题讨论】:

    标签: sql-server pivot common-table-expression


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多