2017-04-19 64 views
0

這是我的T-SQL代碼:如何根據列的值對一個記錄集的總和進行求和?

SELECT H.ORDER_DATE 'Order Date', 
     SUM(D.WORK_QTY) 'Work Qty', 
     SUM(TD. TRAN_QTY) 'Transaction Qty', 
     IM.PUMJ_CD 

FROM [dbo].[ORDER_HEADER] H 

    LEFT JOIN ORDER_DETAIL D ON D.ORDER_ID = H.ORDER_ID 
    LEFT JOIN TRAN_HEADER T ON T.ORDER_ID = H.ORDER_ID 
    LEFT JOIN TRAN_DETAIL TD ON TD.TRAN_ID = T.TRAN_ID 
    LEFT JOIN TRAN_TYPE TT ON TT.TRAN_TYPE_ID = TD.TRAN_TYPE_ID 
    LEFT JOIN ITM_MST IM ON IM.ITM_NM = D.ITEM_NAME 

WHERE TD.TRAN_TYPE_ID = '231' 
     AND PUMJ_CD IN ('BF','BR','SHFT','BJ','TJ') 
     AND H.ORDER_DATE BETWEEN '20170403' AND '20170407' 

GROUP BY IM.PUMJ_CD, 
      H.ORDER_DATE 

ORDER BY H.ORDER_DATE 

,並返回記錄集:

Order Date | Work Qty | Transaction Qty | PUMJ_CD 
------------------------------------------------- 
20170403 | 10  | 7    | BF 
20170403 | 24  | 12    | BR 
20170403 | 16  | 14    | TJ 
20170404 | 15  | 10    | BF 

是否有可能從記錄集求和行,其中: 「訂購日期」是同樣,和 PUMJ_CD IN( 'BF', 'BR') ,並有導致記錄集的樣子:

Order Date | Work Qty | Transaction Qty | PUMJ_CD 
------------------------------------------------- 
20170403 | 34  | 19    | TOTAL 
20170403 | 16  | 14    | TJ 
20170404 | 15  | 10    | BF 

我一直在試圖找出一種方法在一個查詢中做到這一點,但由於我的知識有限,我沒有取得成功。我嘗試過在線查找,但我發現很難用谷歌中的問題來描述我需要的內容。如果任何人能夠幫助或指出我正確的方向,那將是非常感謝。

回答

0

利用聯盟在兩組數據:

如果你想要一個單獨的值你可以做輕微的修改。

1 - 無BR和BF
2 - 只是BR和BF作爲總

SELECT H.ORDER_DATE 'Order Date', 
     SUM(D.WORK_QTY) 'Work Qty', 
     SUM(TD. TRAN_QTY) 'Transaction Qty', 
     IM.PUMJ_CD 

FROM [dbo].[ORDER_HEADER] H 

    LEFT JOIN ORDER_DETAIL D ON D.ORDER_ID = H.ORDER_ID 
    LEFT JOIN TRAN_HEADER T ON T.ORDER_ID = H.ORDER_ID 
    LEFT JOIN TRAN_DETAIL TD ON TD.TRAN_ID = T.TRAN_ID 
    LEFT JOIN TRAN_TYPE TT ON TT.TRAN_TYPE_ID = TD.TRAN_TYPE_ID 
    LEFT JOIN ITM_MST IM ON IM.ITM_NM = D.ITEM_NAME 

WHERE TD.TRAN_TYPE_ID = '231' 
     AND PUMJ_CD IN ('SHFT','BJ','TJ') -- NO BR BF 
     AND H.ORDER_DATE BETWEEN '20170403' AND '20170407' 

GROUP BY IM.PUMJ_CD, 
      H.ORDER_DATE 

union 

SELECT H.ORDER_DATE, 
     SUM(D.WORK_QTY), 
     SUM(TD. TRAN_QTY), 
     'TOTAL' 

FROM [dbo].[ORDER_HEADER] H 

    LEFT JOIN ORDER_DETAIL D ON D.ORDER_ID = H.ORDER_ID 
    LEFT JOIN TRAN_HEADER T ON T.ORDER_ID = H.ORDER_ID 
    LEFT JOIN TRAN_DETAIL TD ON TD.TRAN_ID = T.TRAN_ID 
    LEFT JOIN TRAN_TYPE TT ON TT.TRAN_TYPE_ID = TD.TRAN_TYPE_ID 
    LEFT JOIN ITM_MST IM ON IM.ITM_NM = D.ITEM_NAME 

WHERE TD.TRAN_TYPE_ID = '231' 
     AND PUMJ_CD IN ('BF','BR') -- ONLY BF AND BR AS TOTAL 
     AND H.ORDER_DATE BETWEEN '20170403' AND '20170407' 

GROUP BY H.ORDER_DATE 
+0

這工作!我只需要在第二個SELECT語句中替換句號錯誤類型,並且查詢成功執行。我還添加了一個 ORDER BY H.ORDER_DATE 以按順序獲取行。感謝您的幫助! –

1

是的。您可以使用CASE的聚集和在SELECT

SELECT H.ORDER_DATE as [Order Date], 
     SUM(D.WORK_QTY) as [Work Qty], 
     SUM(TD. TRAN_QTY) as [Transaction Qty], 
     (CASE WHEN IM.PUMJ_CD IN ('BF','BR') THEN 'TOTAL' ELSE IM.PUMJ_CD 
     END) as PUMJ_CD 
FROM . . . 
GROUP BY H.ORDER_DATE, 
     (CASE WHEN IM.PUMJ_CD IN ('BF','BR') THEN 'TOTAL' ELSE IM.PUMJ_CD 
      END) 

這是你想要的東西有點不同。對於這兩個值,它總是會返回TOTAL

SELECT H.ORDER_DATE as [Order Date], 
     SUM(D.WORK_QTY) as [Work Qty], 
     SUM(TD. TRAN_QTY) as [Transaction Qty], 
     (CASE WHEN COUNT(*) = 1 THEN MIN(IM.PUMJ_CD) 
       ELSE (CASE WHEN IM.PUMJ_CD IN ('BF','BR') THEN 'TOTAL' ELSE IM.PUMJ_CD) 
     END) as PUMJ_CD 
FROM . . . 
GROUP BY H.ORDER_DATE, 
     (CASE WHEN IM.PUMJ_CD IN ('BF','BR') THEN 'TOTAL' ELSE IM.PUMJ_CD 
      END) 
+0

戈登,首先,感謝你的幫助。 我試過你的解決方案,並且都只是將'BF'和'BR'行的PUMJ_CD值更改爲'TOTAL',它並沒有像我想要的那樣對行進行求和。另外,GROUP BY在CASE語句中不能成功執行,我不得不用IM.PUMJ_CD替換它。我不確定這是爲什麼這些行沒有總結,也許你可以闡明這一點? –

+0

@ J.Lee。 。 。第一個版本應該和'CASE'一起執行。你必須確定'CASE'在'SELECT'和'GROUP BY'中是相同的。 –

相關問題