Progress DB,需要合并两个查询

时间:2013-01-11 16:02:19

标签: sql join group-by aggregate-functions progress-db

我有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

由于

2 个答案:

答案 0 :(得分: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 s中结束的原因)。 INNER JOIN在技术上会以相同的方式运行,但通常不会引起注意,因为排除正确的表也会排除左表。

答案 1 :(得分: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
相关问题