Получение подсчета с условиями в подзапросе - PullRequest
0 голосов
/ 27 января 2019

У меня есть 4 таблицы, ниже. Мне нужно получить количество contact_made_id из таблицы contact_made для записей, где 'status_loan_id' = 33 или 43

Я мог бы сделать это с помощью подзапроса, однако мне нужно и получить счетчик в результате запроса, и порядок по счетчику в присоединенном запросе

  1. кредиты
    loan_id | Client_id
    ---------------------
    9727    |   12668
    9780    |   12720
    9781    |   12721
    9782    |   12722
    9783    |   12723
    9784    |   12724
    9785    |   12725
  1. Клиенты
    Client_id
    ---------------------
    12668
    12720
    12721
    12722
    12723
    12724
    12725
  1. clients_coms
    client_coms_id |   client_id
    -----------------------------
    2114           |   12668 
    2115           |   12668 
    2116           |   12668 
    2117           |   12668  
    2121           |   12668 
    2122           |   12668  
    2260           |   12720 
    2261           |   12720  
    2262           |   12720  
    2263           |   12721  
    2264           |   12721  
    2265           |   12721  
    2266           |   12722  
    2267           |   12722  
    2268           |   12723 
    2269           |   12723  
    2270           |   12723  
    2271           |   12723  
    2272           |   12724  
    2273           |   12724 
    2274           |   12724  
    2275           |   12724 
    2276           |   12725 
    2277           |   12725  
    2278           |   12725  
  1. contact_made
    contact_made_id | loan_id | status_loan_id
    1               | 9727    | 3  
    2               | 9727    | 3  
    3               | 9727    | 34   
    4               | 9727    | 33  
    5               | 9727    | 3 
    6               | 9727    | 33 
    9               | 9727    | 3 
    0               | 9727    | 3 
    11              | 9782    | 33 
    12              | 9782    | 3 
    13              | 9782    | 33 
    14              | 9782    | 3 
    15              | 9782    | 34 

У меня есть приведенный ниже SQL, однако он выдает следующий неверный вывод

SELECT 
l.loan_id, 
COUNT(cm.contact_made_id) AS contact_count
FROM loans l
LEFT JOIN contact_made cm 
          ON l.loan_id = cm.loan_id 
          AND (cm.status_loan_id = 33 OR cm.status_loan_id = 34)
LEFT JOIN clients_coms com 
          ON l.client_id = com.client_id
GROUP BY l.loan_id
ORDER BY contact_count ASC

Выходы ...

loan_id | contact_count     
------------------------
9780    | 0
9781    | 0
9783    | 0
9784    | 0
9785    | 0
9782    | 6
9727    | 18

Должен вывести ...

loan_id | contact_count     
------------------------
9780    | 0
9781    | 0
9783    | 0
9784    | 0
9785    | 0
9782    | 2
9727    | 3

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Вы почти у цели.

Чтобы избежать дубликатов, вы можете просто использовать COUNT(DISTINCT...), например:

COUNT(DISTINCT cm.contact_made_id) AS contact_count

Но что касается этого, вам не нужно JOIN clients_coms, так как loan_id имеется в таблицах contact_made и loans. Удаление этого объединения позволяет избежать дубликатов, и, следовательно, необходимо использовать DISTINCT. Я также изменил условия OR на loan_id на IN.

SELECT l.loan_id, COUNT(cm.loan_id) contact_count
FROM 
    loans l 
    LEFT JOIN contact_made cm 
        ON l.loan_id = cm.loan_id 
        AND cm.status_loan_id IN (33, 34)
GROUP BY loan_id
ORDER BY 2, 1;

Выход:

| loan_id | contact_count |
| ------- | ------------- |
| 9780    | 0             |
| 9781    | 0             |
| 9783    | 0             |
| 9784    | 0             |
| 9785    | 0             |
| 9727    | 3             |
| 9782    | 3             |

Демонстрация на DB Fiddle .

0 голосов
/ 27 января 2019

Можете ли вы запустить его с условием где?

SELECT 
l.loan_id, 
COUNT(cm.contact_made_id) AS contact_count
FROM loans l
LEFT JOIN contact_made cm 
          ON l.loan_id = cm.loan_id 
LEFT JOIN clients_coms com 
          ON l.client_id = com.client_id
WHERE cm.status_loan_id in (33, 34)
GROUP BY l.loan_id
ORDER BY contact_count ASC

, если нет, попробуйте использовать Inner Join +, где условие

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