SQL - оператор SELECT с подзапросами - PullRequest
1 голос
/ 20 июня 2020

Давайте возьмем приведенную ниже таблицу в качестве образца

ID Name Status
1  Jon  pass
2  Jon  fail
3  Jon  fail
4  Snow pass
5  Snow fail
6  Snow fail

Мне нужно написать запрос, который отображает результаты в следующем формате

Name Total Pass Fail
Jon  3     1    2
Snow 3     1    2

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

SELECT 
    Name, 
    count(ID) as Total,
    (SELECT count(ID) FROM results WHERE status = 'pass') as Pass
    (SELECT count(ID) FROM results WHERE status = 'fail') as Fail
FROM results
HAVING count(ID)>2 
GROUP BY Name 
ORDER BY count(ID) desc;

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Вы можете сделать это с помощью условного агрегирования:

SELECT 
    Name, 
    COUNT(ID) as Total,
    COUNT(CASE WHEN status = 'pass' THEN 1 END) Pass,
    COUNT(CASE WHEN status = 'fail' THEN 1 END) Fail
FROM results
GROUP BY Name 
HAVING COUNT(ID) > 2
ORDER BY COUNT(ID) desc;

Я сохранил предложение HAVING (которое должно быть помещено после GROUP BY), потому что вы используете его в своем коде.

См. демонстрацию . Результатов:

> NAME | TOTAL | PASS | FAIL
> :--- | ----: | ---: | ---:
> Jon  |     3 |    1 |    2
> Snow |     3 |    1 |    2
1 голос
/ 20 июня 2020

Попробуйте этот сценарий ниже -

SELECT 
Name, 
count(ID) as Total,
SUM(CASE WHEN status = 'pass' THEN 1 ELSE 0 END)  as Pass,
SUM(CASE WHEN status = 'fail' THEN 1 ELSE 0 END)  as fail
FROM results
GROUP BY Name 
HAVING count(ID)>2 
ORDER BY count(ID) desc;
...