Комплекс SQL Запрос в JOIN - PullRequest
0 голосов
/ 10 января 2020

Таблицы

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, но я не получается как?

Ответы [ 3 ]

1 голос
/ 10 января 2020

Попробуйте это:

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;
0 голосов
/ 10 января 2020

Используйте 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, либо первичным ключом.

0 голосов
/ 10 января 2020

Может работать что-то вроде

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...