Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Progress DB,需要合并两个查询_Sql_Join_Group By_Aggregate Functions_Progress Db - Fatal编程技术网

Sql Progress DB,需要合并两个查询

Sql Progress DB,需要合并两个查询,sql,join,group-by,aggregate-functions,progress-db,Sql,Join,Group By,Aggregate Functions,Progress Db,我有两个progress数据库查询,我正试图将它们合并到一个语句中,但出现了错误。每个查询只返回一个数字,我想将这两个数字相加。要么这样,要么从头开始进行另一个查询。它们都接受DM1的一组值代码,并且都接受1个产品 问题1 问题2 合并尝试至今 谢谢我认为这应该可以做到,因为每个查询都能按预期工作: SELECT sum1.tot + sum2.tot FROM (SELECT SUM(opn3.samt) as tot FROM PUB.ord ord3, PUB.opn opn3 WH

我有两个progress数据库查询,我正试图将它们合并到一个语句中,但出现了错误。每个查询只返回一个数字,我想将这两个数字相加。要么这样,要么从头开始进行另一个查询。它们都接受DM1的一组值代码,并且都接受1个产品

问题1

问题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

我认为这会起作用,尽管最好有样本数据来验证:

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
关于查询/资料的说明:

始终显式限定联接,不要使用逗号分隔从句 我认为你不需要ord.DM1!=,假设值必须在特定的集合中 将子句放入左连接条件而不是WHERE子句的效果稍有不同;它将条件添加到联接中,而不是筛选。这意味着可以根据左表中的某些内容排除行,而不管您是否需要实际的行。这就是为什么ord.stat最终会出现在左联接中。从技术上讲,内部联接的行为方式是相同的,但通常不会引起注意,因为导致右表被排除也会排除左表。
亲爱的上帝,你做到了!天哪,太谢谢你了。你让一个在一个荒唐统治的国家里的脑死程序员非常高兴!
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
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
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