2016-10-05 4 views
2

Ich habe unter SQL Server-AbfragedatenWie konvertiert man zwei Zeilen in einer einzelnen Zeile?

Sample data

für Lösung.

SQL Query:

SELECT 
    p.ProjectName, 
    i.ItemName, 
    inv.TransactionDirection, 
    SUM(inv.TransactionQty) AS TransactionQuantity 
FROM INVTransaction inv 
JOIN BDProject p ON p.ProjectID=inv.ProjectID 
JOIN MDItem i ON i.ItemID=inv.ItemID 
GROUP BY p.ProjectName, 
    i.ItemName, 
    inv.TransactionDirection 
+0

Machen Sie zwei separate Abfragen ersetzen – Treycos

+0

Welche Boolesche Bedingung? –

+0

@JaydipJ die TransactionDirection würde ich sagen. – Jens

Antwort

2

Ich glaube, Sie nur bedingte Aggregation wollen:

SELECT p.ProjectName, i.ItemName, 
     SUM(CASE WHEN inv.TransactionDirection = 'IN' THEN inv.TransactionQty ELSE 0 END) as IN_Quantity, 
     SUM(CASE WHEN inv.TransactionDirection = 'OUT' THEN inv.TransactionQty ELSE 0 END) as OUT_Quantity, 
     SUM(CASE WHEN inv.TransactionDirection = 'IN' THEN inv.TransactionQty 
       WHEN inv.TransactionDirection = 'OUT' THEN -inv.TransactionQty 
       ELSE 0 
      END) as Balance 
FROM INVTransaction inv JOIN 
    BDProject p 
    ON p.ProjectID = inv.ProjectID JOIN 
    MDItem i ON i.ItemID = inv.ItemID 
GROUP BY p.ProjectName, i.ItemName 
+0

Vielen Dank, es funktioniert gut außer Balance Spalte nicht die richtigen Unterschiede zur Verfügung stellt. –

+0

Sie können die von Gordon vorgeschlagene Abfrage als Unterabfrage verwenden, beispielsweise: 'select *, (IN_Quantity - OUT_Quantity) als Balance from ( SELECT inv.ProjectName, inv.ItemName, SUM (CASE WHEN inv.TransactionDirection = ' IN 'TH inv.TransactionQty ELSE 0 END) als IN_Quantity, SUMME (CASE WHEN inv.TransactionDirection =' OUT 'THEN inv.TransactionQty ELSE 0 END) als OUT_Quantity VON (...)) t' – owczarek

+0

@KayserAhmed. . . Ich hatte die 'Balance'-Berechnung falsch verstanden. Die Abfrage sollte es jetzt richtig machen. –

0

Sie Pivot für diese verwenden können. Unten ist eine funktionierende Abfrage.

SELECT PROJECTNAME,ITEMNAME,[IN],[OUT] ,ISNULL([IN],0)-ISNULL([OUT],0) AS BALANCE FROM 
(SELECT PROJECTNAME,ITEMNAME,TRANSACTIONDIRECTION,TRANSACTIONQUANTITY FROM TRANSACTIONS 
)A 
PIVOT (SUM(TRANSACTIONQUANTITY) FOR TRANSACTIONDIRECTION IN ([IN],[OUT])) AS PVT 

ersetzen GESCHÄFTE mit Ihrem Tabellennamen

+0

Es funktioniert, Danke. –

0

Als @Gordon Linoff fast Lösung zur Verfügung gestellt, aber für die Balance Spalte können Sie

SUM(inv.TransactionQty) as Balance 

Mit

SUM(CASE WHEN inv.TransactionDirection = 'IN' 
     THEN inv.TransactionQty 
     ELSE -1*inv.TransactionQty END) as Balance 
+0

Es funktioniert, Danke. –

Verwandte Themen