【问题标题】:Complex SQL Query in JOINJOIN 中的复杂 SQL 查询
【发布时间】:2020-01-10 12:23:54
【问题描述】:

表格

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 来实现,但我不知道如何实现?

【问题讨论】:

  • 又快又脏:将现有查询用作子查询,将其加入表中。

标签: sql database db2


【解决方案1】:

试试这个:

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;

【讨论】:

    【解决方案2】:

    类似

    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 的那些。

    【讨论】:

      【解决方案3】:

      使用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 将所有内容保存在 first 表中——这是您想要的,以及第二个表中的匹配行。

      当您计算事务数时,count() 的参数应该是在 on 子句中使用的列或主键。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 2014-10-25
        • 1970-01-01
        相关资源
        最近更新 更多