2016-10-31 4 views
2

Ich habe die folgende SQL-AbfrageDie Spalte '638' wurde mehrfach für 'PVT' angegeben. 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 

es die result.Giving mir Gesamtmenge für Standorte RIY und eas zu erwarten gibt.

Ich möchte jedoch die Store-Namen dynamisch abrufen, anstatt sie manuell anzugeben.

das habe ich gemacht.

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 

Das gibt mir eine Fehlermeldung, Die Spalte ‚638‘ wurde mehrfach für ‚PVT‘ angegeben.

Wie kann ich dieses Problem lösen?

Antwort

3

Ohne Ihre tatsächlichen Daten zu wissen, dies ist ein Blindflug, aber ich glaube, Sie haben zwei Probleme:

  • Sie DISTINCT verwenden muss jeder bekommen Wert nur einmal
  • Sie verketten nicht die Namen der Filialen, sondern die IDs Ihrer Produkte
Diesen

Versuchen

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

Sie hatten ein besseres über sein Problem gelesen. Das Produkt/Store-Problem wurde nicht angezeigt. –

2

So stellen Sie sicher, dass die cols DISTINCT sind

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

Dank @Shnugo mich in der richtigen Richtung zu schieben. Hier ist die Abfrage, die ich schließlich verwendet habe.

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 
Verwandte Themen