我尝试使用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;
2条答案
按热度按时间cu6pst1q1#
你的
WHERE
子句正在撤消外部联接。将除第一个表以外的所有表上的条件移到ON
条款:注意表别名的使用。它们使查询更易于编写和读取。
请注意,我更改了日期常量以使用标准方法引入它们。我建议你把
TRUNC()
也:这对优化器更好——无论是在索引还是表统计方面。
xe55xuns2#
最好将ddl和一些示例数据粘贴到这些表中。
但我认为查看可用信息的问题是,如果cttrans中的transaction中没有事务意味着没有匹配的行,那么数据将为空,因此您应该在代码的第二行使用sum(nvl(cttrans.cv\u amount,0))并检查结果。
我在livesql.oracle.com上执行了以下两个查询
第一次查询时,薪资为空
使用nvl后,第二次查询将给出0的薪资
请分享反馈,如果问题没有得到解决,请按要求分享细节。