0

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

示例表:(注意:该表有 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 求和。下面的代码汇总了 ID = 1 的 TYPE = 'PO' 的所有数量值。然后将它们与 ID = 1 的 TYPE = 'MANUAL/BACKFLUSH' 的所有总数量值进行比较。此代码在这方面非常有效(非常感谢给尼古拉斯克拉斯诺夫这个):

 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 什么的?我希望我已经清楚我希望实现的目标。

感谢小伙伴们一直以来的支持!:)

4

3 回答 3

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
于 2012-09-27T14:56:18.300 回答
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。另外,我不确定要使用哪些列名,因为它们在您的问题和代码示例之间不一致。我用了最短的形式。

要返回记录 where 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子句来执行此操作。

于 2012-09-27T14:33:39.993 回答
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'

谢谢大家的帮助!!

于 2012-09-27T14:57:12.743 回答