2013-01-11 17 views
0

我有2个进度数据库查询,我试图将它们合并成一个语句,但我收到错误。这些查询中的每一个都只是返回一个数字,我想将这两个数字相加。要么是从头开始另一个查询。他们都为“DM1”提供一组价值代码,他们都接受1个“产品”。进度数据库,需要合并两个查询

查询1

SELECT SUM(opn3.samt) 
    FROM PUB.ord ord3, PUB.opn opn3 
    WHERE 
    ord3.subsnum = opn3.subsnum 
    AND ord3.onum = opn3.onum 
    AND ord3.DM1 != '' 
    AND ord3.DM1 IN('XCWAJC25','WCWAMO73') 
    AND ord3.prdcde = 'CSC' 
    AND ord3.stat != 16 
    AND opn3.samt >= 0 
    GROUP BY ord3.DM1, ord3.prdcde 

查询2

SELECT SUM((-1 * opn2.samt) + ord2.samt) 
    FROM PUB.ord ord2, PUB.opn opn2 
    WHERE 
    ord2.subsnum = opn2.subsnum 
    AND ord2.onum = opn2.onum 
    AND ord2.DM1 != '' 
    AND ord2.DM1 IN('XCWAJC25','WCWAMO73') 
    AND ord2.prdcde = 'CSC' 
    AND ord2.stat = 16 
    AND opn2.samt < 0 
    GROUP BY ord2.DM1, ord2.prdcde 

合并企图到目前为止...

SELECT SUM(opn3.samt + (SELECT SUM((-1 * opn2.samt) + ord2.samt) 
    FROM PUB.ord ord2, PUB.opn opn2 
    WHERE 
    ord2.subsnum = opn2.subsnum 
    AND ord2.onum = opn2.onum 
    AND ord2.DM1 != '' 
    AND ord2.DM1 = ord3.DM1 
    AND ord2.prdcde = ord3.prdcde 
    AND ord2.stat = 16 
    AND opn2.samt < 0 
    GROUP BY ord2.DM1, ord2.prdcde 
)) as foo 

    FROM PUB.ord ord3, PUB.opn opn3 
    WHERE 
    ord3.subsnum = opn3.subsnum 
    AND ord3.onum = opn3.onum 
    AND ord3.DM1 != '' 
    AND ord3.DM1 IN('XCWAJC25','WCWAMO73') 
    AND ord3.prdcde = 'CSC' 
    AND ord3.stat != 16 
    AND opn3.samt >= 0 
    GROUP BY ord3.DM1, ord3.prdcde 

感谢

回答

1

我认为这会工作,但它会是不错的样本数据来验证:

SELECT COALESCE(SUM(a.samt), 0) - COALESCE(SUM(b.samt), 0) 
     + COALESCE(SUM(CASE WHEN ord.stat = 16 
           AND b.samt < 0 
          THEN ord.samt END), 0) 
FROM PUB.ord ord 
LEFT JOIN PUB.opn a 
     ON a.subsnum = ord.subsnum 
      AND a.onum = ord.onum 
      AND a.samt >= 0 
      AND ord.stat != 16 
LEFT JOIN PUB.opn b 
      ON b.subsnum = ord.subsnum 
      AND b.onum = ord.onum 
      AND b.samt < 0 
      AND ord.stat = 16 
WHERE ord.DM1 IN('XCWAJC25', 'WCWAMO73') 
     AND ord.prdcde = 'CSC' 
GROUP BY ord.DM1 

上查询/东东注:

  • 始终明确限定连接时,不要使用逗号分隔FROM
  • 我不认为你需要ord.DM1 != '',因为值必须在特定的设置
  • 把一个条款为LEFT JOIN条件,而不是WHERE子句有一个略有不同的效果;它将条件添加到连接中,而不是过滤。这意味着可以根据左表中的某些内容排除行,而不管您是否需要实际行(这就是为什么ord.statLEFT JOIN为结尾)。 INNER JOIN s在技术上会表现相同的方式,但通常不会引起注意,因为排除右表也会排除左表。
+0

亲爱的上帝你已经做到了! OMG,非常感谢。你已经在一个荒谬统治的国家让一个脑死亡的程序员非常高兴! – PolishHurricane

0

我想这应该做的伎俩,考虑到个人的查询工作打算:

SELECT sum1.tot + sum2.tot 
FROM 
(SELECT SUM(opn3.samt) as tot 
FROM PUB.ord ord3, PUB.opn opn3 
WHERE 
ord3.subsnum = opn3.subsnum 
AND ord3.onum = opn3.onum 
AND ord3.DM1 != '' 
AND ord3.DM1 IN('XCWAJC25','WCWAMO73') 
AND ord3.prdcde = 'CSC' 
AND ord3.stat != 16 
AND opn3.samt >= 0 
GROUP BY ord3.DM1, ord3.prdcde) sum1, 

(SELECT SUM((-1 * opn2.samt) + ord2.samt) as tot 
FROM PUB.ord ord2, PUB.opn opn2 
WHERE 
ord2.subsnum = opn2.subsnum 
AND ord2.onum = opn2.onum 
AND ord2.DM1 != '' 
AND ord2.DM1 IN('XCWAJC25','WCWAMO73') 
AND ord2.prdcde = 'CSC' 
AND ord2.stat = 16 
AND opn2.samt < 0 
GROUP BY ord2.DM1, ord2.prdcde) sum2