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;

快速脏:将现有查询用作子查询,左键将其连接回表。