【问题标题】:Progress DB, need to merge two queriesProgress DB,需要合并两个查询
【发布时间】:2012-12-26 06:10:51
【问题描述】:

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

谢谢

【问题讨论】:

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


    【解决方案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.stat 最终出现在LEFT JOINs 中的原因)。从技术上讲,INNER JOINs 的行为方式相同,但通常不会引起注意,因为排除右表也会排除左表。

    【讨论】:

    • 亲爱的上帝,你做到了!天哪,非常感谢这个人。在一个治理荒谬的国家,你让一个脑残的程序员非常高兴!
    【解决方案2】:

    鉴于各个查询按预期工作,我认为这应该可以解决问题:

    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
    

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      相关资源
      最近更新 更多