汇总按多个字段分组的数量

时间:2012-09-27 14:29:50

标签: sql database oracle plsql sum

这是我以前的问题的后续内容。我觉得如果我再次解释它会更容易,因为我想尝试从我的查询中获取更多细节。所以我们走了:

样本表: (注意:该表有100个ID,每个ID都有许多不同的LOTNO)

ITEMNO LOTNO TRANS_QUAN TRANS_TYPE


 1      45        16          PO  
 1       3         2          PO  
 1      45        47          MH  
 1      45         3          MH
 1       3         8          MH

到目前为止,我没有考虑每个ID的不同LotNo,而是根据ID和TYPE求和。下面的代码汇总TYPE ='PO'的所有数量值,ID = 1.然后将它们与TYPE ='MANUAL / BACKFLUSH'的所有总和数值进行比较,ID = 1.此代码在这方面工作得很好(非常感谢以尼古拉斯·克拉斯诺夫为例:

 SELECT * 
 FROM (SELECT TR.ITEMNO
         , ROUND(SUM(TR.TRANS_QUAN * (DECODE(TR.TRANS_TYPE, 'PO', 1, 0)))) AS SUM_IN
         , ROUND(SUM(TR.TRANS_QUAN * (DECODE(TR.TRANS_TYPE, 'MANUAL/BACKFLUSH', 1,0))))AS SUM_OUT
     FROM IQMS.TRANSLOG TR
     GROUP BY IQMS.TR.ITEMNO
     ORDER BY IQMS.TR.ITEMNO)
 WHERE SUM_OUT > SUM_IN

我想进一步打破总和计算并合并LOTNO字段。因此,在上表中,对于ID = 1,我想要将ID = 1,LotNo = 45和TYPE = PO的所有值相加,然后将它们与ID = 1,LotNo = 45和TYPE ='MANUAL \ BACKFLUSH'进行比较。

然后我想继续比较(ID = 1,LOTNO = 3,TYPE ='PO')(ID = 1,LOTNO = 3,TYPE ='MANUAL / BACKFLUSH')等等。

我也只想返回SUM_OUT>的记录。 SUM_IN

我希望我的输出类似于

ID      LOTNO     SUM_IN      SUM_OUT    

 1        45        30           50
 1         3         2            8

关于我如何融入这一点的任何想法,给出更具体的结果集?可能是一些简单的东西,如额外的GROUP BY或其他东西?我希望我已经明确了我希望实现的目标。

感谢持续的支持! :)

3 个答案:

答案 0 :(得分:1)

我认为以下查询可以满足您的需求。 。

select id, lotno,
       sum(case when type = 'PO' then quantity else 0 end) as sum_in,
       sum(case when type = 'MANUAL/BACKFLUSH' then quantity else 0 end) as sum_out
from IQMS.TRANSLOG TR
group by id, lotno

case语句是标准SQL; decode特定于Oracle。此外,我不确定要使用哪些列名,因为它们在您的问题和代码示例之间不一致。我使用最短的形式。

要返回sum_out > sum_in的记录,可以将其作为子查询嵌入:

select t.*
from (select id, lotno,
             sum(case when type = 'PO' then quantity else 0
                 end) as sum_in,
             sum(case when type = 'MANUAL/BACKFLUSH' then quantity else 0
                 end) as sum_out
      from IQMS.TRANSLOG TR
      group by id, lotno
     ) t
where sum_out > sum_in

您也可以使用having子句执行此操作。

答案 1 :(得分:1)

根据您的样本数据,您正在寻找的是什么?

select *
  from ( SELECT TR.ITEMNO
              , tr.lotno
              , ROUND(SUM(TR.TRANS_QUAN * (DECODE(TR.TRANS_TYPE, 'PO', 1, 0)))) AS SUM_IN
              , ROUND(SUM(TR.TRANS_QUAN * (DECODE(TR.TRANS_TYPE, 'MH', 1,0))))AS SUM_OUT
          FROM TRANSLOG TR
         GROUP BY TR.ITEMNO, tr.lotno
         ORDER BY TR.ITEMNO
       )
 where sum_out > sum_in

答案 2 :(得分:0)

得到了!!! :):)

SELECT *
FROM

  (SELECT TR.ITEMNO, TR.LOTNO,
       SUM(CASE WHEN TR.TRANS_TYPE = 'PO' THEN TR.TRANS_QUAN ELSE 0 END) AS SUM_IN,
       SUM(CASE WHEN TR.TRANS_TYPE = 'MANUAL/BACKFLUSH' THEN TR.TRANS_QUAN ELSE 0 END)AS SUM_OUT
   FROM IQMS.TRANSLOG TR
   GROUP BY TR.ITEMNO, TR.LOTNO
   ORDER BY TR.ITEMNO, TR.LOTNO)

WHERE SUM_OUT > SUM_IN
AND SUM_IN != '0'

谢谢你们的帮助!!