繁体   English   中英

JOIN 中的复杂 SQL 查询

[英]Complex SQL Query in JOIN

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

意图:在没有收到付款( NO_TRANS_CNT )的情况下,找到那些供应商区域的数量

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

想问一下:现在,我还想在这个区域添加TOTAL_SUPPLIERS

  AREA     | TOTAL SUPPLIERS   |  NO_TRANS_CNT
----------+--------------------+----------------
  ABC              1                  0   
  XYZ              1                  0   
  TYU              1                  1                 
  MNO              1                  1
  PQR              1                  0

我认为它可以使用 JOIN 实现,但我无法获得如何?

尝试这个:

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;

就像是

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;

可以工作。 请注意, COUNT(T.PAYMENT) 仅计算 PAYMENT 不为 NULL 的那些。

使用left join ,但从suppliers开始:

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子句中使用的列或主键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM