2016-10-31 2 views
2

Я следующие действия SQL QueryКолонка «638» была указана несколько раз для «PVT». Pivot

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 

это дает ожидаемый result.Giving мне общее количество для местоположений RIY и EAS.

Тем не менее, я хочу динамически получить имена Store вместо того, чтобы вручную их указывать.

Это то, что я сделал.

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 

Это дает мне ошибку говоря Столбец «638» был указан несколько раз для «PVT».

Как я могу решить эту проблему?

ответ

3

Не зная фактические данные это слепой полет, но я думаю, что у вас есть две проблемы:

  • Вы должны использовать DISTINCT, чтобы каждый стоимость только один раз
  • Вы не объединяете имена магазинов, но удостоверяете лимиты своих продуктов

Попробуйте

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,'') 
+0

Вы лучше прочитали о своей проблеме. Не видел проблему с продуктом/магазином. –

2

Просто убедитесь, что перевалы являются DISTINCT

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

Спасибо @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