2017-04-19 65 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'中是相同的。 –

相关问题