2016-10-31 1 views
2

J'ai la requête SQL suivanteLa colonne '638' a été spécifiée plusieurs fois pour '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 

lui donne l'attendu me result.Giving quantité totale pour les emplacements RIY et eas.

Toutefois, je souhaite obtenir dynamiquement les noms Store au lieu de les spécifier manuellement.

c'est ce que j'ai fait.

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 

Cela me donne une erreur disant La colonne '638' a été spécifié à plusieurs reprises pour 'PVT'.

Comment puis-je résoudre ce problème?

Répondre

3

Sans connaître vos données réelles ceci est un vol aveugle, mais je pense que vous avez deux questions:

  • Vous devez utiliser DISTINCT pour obtenir chaque valeur une seule fois
  • Vous n'êtes pas concaténant les noms des magasins, mais les ID de vos produits

Essayez cette

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

Vous avez eu une meilleure lecture de son problème. Vous n'avez pas vu le problème de produit/magasin. –

2

Assurez-vous que les cols sont DISTINCT

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

Merci @Shnugo pour me pousser dans la bonne direction. Voici la requête que j'ai finalement fini par utiliser.

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