2016-10-05 2 views
2

У меня есть ниже запрос данных SQL SERVERКак преобразовать значение двух строк в одну строку?

Sample data

прогностических для решения.

SQL запросов:

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

Сделать два отдельных запросы – Treycos

+0

Какое булево условие? –

+0

@JaydipJ TransactionDirection, я бы сказал. – Jens

ответ

2

Я думаю, что вы просто хотите условную агрегацию:

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

Спасибо, он работает отлично, за исключением столбца баланса, не обеспечивая правильных различий. –

+0

Вы можете использовать запрос, предложенный Гордоном в качестве вспомогательного запроса, например: 'select *, (IN_Quantity - OUT_Quantity) в качестве Баланса from ( SELECT inv.ProjectName, inv.ItemName, SUM (CASE WHEN inv.TransactionDirection = ' IN 'THEN inv.TransactionQty ELSE 0 END) как IN_Quantity, SUM (CASE WHEN inv.TransactionDirection =' OUT 'THEN inv.TransactionQty ELSE 0 END) как OUT_Quantity FROM (...)) t' – owczarek

+0

@KayserAhmed. , , Я неправильно понял расчет «Баланс». Запрос должен сделать это правильно сейчас. –

0

Вы можете использовать Pivot для этого. Ниже приведен рабочий запрос.

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 

Заменить СДЕЛКИ с именем таблицы

+0

Он работает, спасибо. –

0

Как @Gordon Linoff почти предусмотрен решением, но для столбца баланса можно заменить

SUM(inv.TransactionQty) as Balance 

С

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

Это работает, спасибо. –