【问题标题】:The column '638' was specified multiple times for 'PVT'. Pivot为“PVT”多次指定了“638”列。枢
【发布时间】:2017-03-13 16:37:57
【问题描述】:

我有以下 SQL 查询

Select Product_Id, [riy] AS [riy],
  [eas] AS [eas]
  FROM
  (SELECT Product_Id, Store_Name, Quantity
  FROM [Product_Stock]  INNER JOIN Store on Store.Id = [Product_Stock].Stock_Id where Product_Id = 435) ps
  PIVOT
  (
  SUM(Quantity)
  FOR Store_Name IN
  ([riy],[EAST WAREHOUSE - eas])
  ) AS pvt

它给出了预期的结果。给了我位置 riy 和 eas 的总数量。

但是,我想动态获取商店名称,而不是手动指定它们。

这就是我所做的。

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT  ',' + QUOTENAME([Product_Id]) 
                    FROM [Product_Stock]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SELECT @query = 
'SELECT Product_Id FROM
(SELECT Product_Id, Store_Name, Quantity
  FROM [Product_Stock]  INNER JOIN Store on Store.Id = [Product_Stock].Stock_Id where Product_Id = 435) PS
PIVOT 
(
    SUM(Quantity)
    FOR Store_Name in (' + @cols + ')
) AS PVT'

EXEC SP_EXECUTESQL @query

这给了我一个错误提示 为“PVT”多次指定了“638”列。

我该如何解决这个问题?

【问题讨论】:

    标签: sql sql-server-2008 tsql pivot-table crosstab


    【解决方案1】:

    在不知道您的实际数据的情况下,这是一次盲目的飞行,但我认为您有两个问题:

    • 您必须使用DISTINCT 来获取每个值一次
    • 您连接的不是商店名称,而是产品的 ID

    试试这个

    SELECT @cols = STUFF((SELECT DISTINCT  ',' + QUOTENAME([Store_Name]) 
                    FROM [Product_Stock]
                    INNER JOIN Store on Store.Id = [Product_Stock].Stock_Id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
    

    【讨论】:

    • 您对他的问题有更好的了解。没有看到产品/商店问题。
    【解决方案2】:

    只要确保列是不同的

    ... STUFF((SELECT DISTINCT  ','...
    

    【讨论】:

      【解决方案3】:

      感谢@Shnugo 将我推向正确的方向。这是我最终使用的查询。

      DECLARE @cols AS NVARCHAR(MAX),
      @query  AS NVARCHAR(MAX)
      
      SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME([Store].Store_Name) 
                          FROM [Store] INNER JOIN Product_Stock ON Product_Stock.Stock_Id = Store.Id
                  FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)') 
              ,1,1,'')
      
      SELECT @query = 
      'SELECT Product_Id , ' + @cols + ' from
      (SELECT Product_Id, Store_Name, Quantity
        FROM [Product_Stock]  INNER JOIN Store on Store.Id = [Product_Stock].Stock_Id WHERE Product_Stock.product_id = 435 ) PS
      PIVOT 
      (
          SUM(Quantity)
          FOR Store_Name in (' + @cols + ')
      ) AS PVT'
      
      EXEC SP_EXECUTESQL @query
      

      【讨论】:

        猜你喜欢
        • 2020-07-13
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多