sql—即使值为0,如何在查询中查看和显示总和

mum43rcc  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(273)

我尝试使用oracle sql查询连接多个表,并显示表“arab\u countries”中每个国家的总和,该表在表“cttrans”中有一个事务
我试图显示每个国家的交易总额。但是,没有交易的国家不在输出中显示
例如。”aaa”没有事务,但它没有显示在我的查询结果中。我需要它显示为0

SELECT ARAB_COUNTRIES.COMP_CODE, ARAB_COUNTRIES.COUNTRY_CODE, ARAB_COUNTRIES.SS_CODE, ARAB_COUNTRIES.BRIEF_DESC_ARAB, ARAB_COUNTRIES.LONG_DESC_ENG, ARAB_COUNTRIES.LONG_DESC_ARAB,
SUM(CTTRANS.CV_AMOUNT)
FROM ARAB_COUNTRIES 
 LEFT JOIN CUST 
 ON (ARAB_COUNTRIES.COMP_CODE = CUST.COMP_CODE)
AND (ARAB_COUNTRIES.COUNTRY_CODE = CUST.NATION_CODE)
LEFT JOIN CTTRANS
ON (CTTRANS.COMP_CODE = CUST.COMP_CODE ) 
 AND (CTTRANS.TRS_AC_CUST = CUST.CUST_NO)
    WHERE 
    CTTRANS.STATUS = 'P' AND CTTRANS.TRX_TYPE IN (201,15,35,586) 
    AND TRUNC(CTTRANS.TRS_DATE) BETWEEN '01-APR-20' AND  '30-JUN-20'
    AND ARAB_COUNTRIES.COUNTRY_CODE <> 999

 GROUP BY ARAB_COUNTRIES.COMP_CODE, ARAB_COUNTRIES.COUNTRY_CODE, ARAB_COUNTRIES.SS_CODE, ARAB_COUNTRIES.BRIEF_DESC_ARAB, ARAB_COUNTRIES.LONG_DESC_ENG, ARAB_COUNTRIES.LONG_DESC_ARAB
ORDER BY ARAB_COUNTRIES.COUNTRY_CODE;
cu6pst1q

cu6pst1q1#

你的 WHERE 子句正在撤消外部联接。将除第一个表以外的所有表上的条件移到 ON 条款:

SELECT ac.COMP_CODE, ac.COUNTRY_CODE, ac.SS_CODE, ac.BRIEF_DESC_ARAB, ac.LONG_DESC_ENG, ac.LONG_DESC_ARAB,
       SUM(t.CV_AMOUNT)
FROM ARAB_COUNTRIES ac LEFT JOIN
     CUST c
     ON ac.COMP_CODE = c.COMP_CODE AND
        ac.COUNTRY_CODE = c.NATION_CODE LEFT JOIN
     CTTRANS t
     ON t.COMP_CODE = c.COMP_CODE AND
        t.TRS_AC_CUST = c.CUST_NO AND
        t.STATUS = 'P' AND
        t.TRX_TYPE IN (201, 15, 35, 586) AND
        TRUNC(t.TRS_DATE) BETWEEN DATE '2020-04-01' AND DATE '2020-06-30'
WHERE ac.COUNTRY_CODE <> 999
GROUP BY ac.COMP_CODE, ac.COUNTRY_CODE, ac.SS_CODE, ac.BRIEF_DESC_ARAB, ac.LONG_DESC_ENG, ac.LONG_DESC_ARAB
ORDER BY ac.COUNTRY_CODE;

注意表别名的使用。它们使查询更易于编写和读取。
请注意,我更改了日期常量以使用标准方法引入它们。我建议你把 TRUNC() 也:

t.TRS_DATE >= DATE '2020-04-01' AND
        t.TRS_DATE < DATE '2020-07-01'

这对优化器更好——无论是在索引还是表统计方面。

xe55xuns

xe55xuns2#

最好将ddl和一些示例数据粘贴到这些表中。
但我认为查看可用信息的问题是,如果cttrans中的transaction中没有事务意味着没有匹配的行,那么数据将为空,因此您应该在代码的第二行使用sum(nvl(cttrans.cv\u amount,0))并检查结果。
我在livesql.oracle.com上执行了以下两个查询
第一次查询时,薪资为空

SELECT A.DEPARTMENT_ID, SUM(B.SALARY) FROM HR.DEPARTMENTS A LEFT JOIN HR.EMPLOYEES B
ON A.DEPARTMENT_ID = B.DEPARTMENT_ID
WHERE A.DEPARTMENT_ID = 120 GROUP BY A.DEPARTMENT_ID ;

使用nvl后,第二次查询将给出0的薪资

SELECT A.DEPARTMENT_ID, SUM(NVL(B.SALARY, 0)) FROM HR.DEPARTMENTS A LEFT JOIN HR.EMPLOYEES B
ON A.DEPARTMENT_ID = B.DEPARTMENT_ID
WHERE A.DEPARTMENT_ID = 120 GROUP BY A.DEPARTMENT_ID ;

请分享反馈,如果问题没有得到解决,请按要求分享细节。

相关问题