这是我以前的问题的后续内容。我觉得如果我再次解释它会更容易,因为我想尝试从我的查询中获取更多细节。所以我们走了:
样本表: (注意:该表有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或其他东西?我希望我已经明确了我希望实现的目标。
感谢持续的支持! :)
答案 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'
谢谢你们的帮助!!