JOIN中的复杂SQL查询
表格JOIN中的复杂SQL查询,sql,database,db2,Sql,Database,Db2,表格 TRANSACTIONS SUPP_ID | PAYMENT ----------+---------- 1001 200 1002 100 1005 250 MASTER_SUPPLIERS SUPP_ID | AREA ----------+---------- 1001 ABC 1002 XYZ 1003 TYU 1004 M
TRANSACTIONS
SUPP_ID | PAYMENT
----------+----------
1001 200
1002 100
1005 250
MASTER_SUPPLIERS
SUPP_ID | AREA
----------+----------
1001 ABC
1002 XYZ
1003 TYU
1004 MNO
1005 PQR
意图:
按区域查找未收到付款(无交易
)的供应商数量
SELECT AREA, COUNT(*) AS NO_TRANS_CNT FROM MASTER_SUPPLIERS
WHERE AREA NOT IN (SELECT DISTINCT(AREA) FROM TRANSACTIONS)
GROUP BY AREA
AREA | NO_TRANS_CNT
----------+--------------
TYU 1
MNO 1
想问:现在,我还想在这一区域添加供应商总数
AREA | TOTAL SUPPLIERS | NO_TRANS_CNT
----------+--------------------+----------------
ABC 1 0
XYZ 1 0
TYU 1 1
MNO 1 1
PQR 1 0
我认为它可以通过连接实现,但我不知道如何实现
select M.AREA, COUNT(*) as TOTAL_SUPPLIERS, COUNT(T.PAYMENT) as NO_TRANS_CNT
from MASTER_SUPPLIERS M left join TRANSACTIONS T
on M.SUPP_ID = T.SUPP_ID
group by M.AREA;
我可以工作。
请注意,计数(T.PAYMENT)仅对付款不为空的部分进行计数。使用
左连接,但从供应商开始:
select ms.area, count(*) as num_suppliers, count(t.supp_id) as num_transactions
from master_suppliers ms left join
transactions t
on t.supp_id = m.supp_id
group by ms.area;
left join
将所有内容保存在第一个表中——这是您所需要的,以及第二个表中匹配的行
计算事务数时,count()
的参数应该是on
子句中使用的列或主键。尝试以下操作:
SELECT
M.AREA
, COUNT(1) TOTAL_SUPPLIERS
, COUNT(CASE WHEN T.SUPP_ID IS NULL THEN 1 END) NO_TRANS_CNT
FROM MASTER_SUPPLIERS M
LEFT JOIN TRANSACTIONS T ON T.SUPP_ID = M.SUPP_ID
GROUP BY M.AREA;
快速脏:将现有查询用作子查询,左键将其连接回表。