Sql показать все данные с использованием количества и где - PullRequest
0 голосов
/ 01 октября 2018

У меня есть 2 таблицы «Банк и заявитель», как при запросе показать все банки и подсчитать, сколько заявителей используют этот банк

Банк :

| id | Bank_desc    
|----|---------
| 1  | Ambank  
| 2  | Maybank  
| 3  | RHB BANK 
| 4  | OSBC     

[Заявитель] [2] :

| id | Name | Bank|STEP|
|----|------|----|----|
|  1 | JACK |  3 | W1 |
|  2 | ANDY |  1 | W4 |
|  3 | VOID |  1 | W1 |
|  4 | RAY  |  1 | W5 |

Я хочу показать весь список банков с общим количеством заявителей, но только там, где заявитель находится на этапе W1 или W4, [Результаты] [2] :

| id | Bank     |Total|
|----|----------|----|
|  1 | Ambank   |  2 |
| 2  | Maybank  |  0 |
| 3  | RHB BANK |  1 |
| 4  | OSBC     |  0 |

Я пробовал это sql

 SELECT
 b.id,
 b.Bank, COUNT(a.Bank) AS Total FROM Bank b LEFT JOIN Applicant a ON b.id = a.Bank WHERE a.step ='W1' or a.step='W4 GROUP BY b.id, b.Bank;

, но результат показывает только банк, который имеет значение, а не весь банк

[Результаты] [2] :

| id | Bank     |Total|
|----|----------|----|
|  1 | Ambank   |  2 |
| 2  | RHB BANK |  1 |

, если я удаляю ГДЕ a.step = 'W1' или a.step = 'W4

он покажет весь список банков, но также покажет все шаги

Любая помощь будет признательна, спасибо заранее!

DEMO SQL

1 Ответ

0 голосов
/ 01 октября 2018

Ваша проблема заключается в том, что ваше условие WHERE исключает банки, у которых нет клиентов ни на одном из этих двух этапов.Вместо этого необходимо изменить запрос на использование условного агрегирования:

WITH Bank AS (
    SELECT 1 AS id, 'Ambank' AS Bank UNION ALL
    SELECT 2, 'Maybank'  UNION ALL
    SELECT 3, 'RHB BANK' UNION ALL
    SELECT 4, 'OSBC'
),
Applicant AS (
    SELECT 1 AS id, 'JACK' AS Name, 3 AS Bank, 'W1' AS Step UNION ALL
    SELECT 2, 'ANDY', 1,'W1' UNION ALL
     SELECT 3, 'ROY', 1,'W4' UNION ALL
    SELECT 4, 'VOID', 1,'W5'
)

SELECT
    b.id,
    b.Bank,
    SUM(CASE WHEN a.step = 'W1' OR a.step = 'W4' THEN 1 ELSE 0 END) AS Total
FROM Bank b
LEFT JOIN Applicant a
    ON b.id = a.Bank
GROUP BY
    b.id,
    b.Bank
ORDER BY
    b.id;

Вывод:

id  Bank        Total
1   Ambank      2
2   Maybank     0
3   RHB BANK    1
4   OSBC        0

Обновлен DBFiddle

...