Справка по SQL-запросу для нескольких столбцов и групп по - PullRequest
3 голосов
/ 12 мая 2011

У меня есть следующая таблица. Студенты:

id | status | school | name
----------------------------
0  | fail   | skool1 | dan
1  | fail   | skool1 | steve
2  | pass   | skool2 | joe
3  | fail   | skool2 | aaron

я хочу результат, который дает мне

school | fail | pass  
---------------------
skool1 | 2    | 0   
skool2 | 1    | 1    

У меня есть это, но это медленно,

SELECT s.school, (

SELECT COUNT( * ) 
FROM school
WHERE name = s.name
AND status = 'fail'
) AS fail, (

SELECT COUNT( * ) 
FROM school
WHERE name = s.name
AND status = 'pass'
) AS pass,

FROM Students s
GROUP BY s.school

предложения?

Ответы [ 2 ]

11 голосов
/ 12 мая 2011

Примерно так должно работать:

SELECT 
    school,
    SUM(CASE WHEN status = 'fail' THEN 1 ELSE 0 END) as [fail],
    SUM(CASE WHEN status = 'pass' THEN 1 ELSE 0 END) as [pass]
FROM Students
GROUP BY school
ORDER BY school

РЕДАКТИРОВАТЬ
Почти забыл, но вы также можете написать запрос так:

SELECT 
    school,
    COUNT(CASE WHEN status = 'fail' THEN 1 END) as [fail],
    COUNT(CASE WHEN status = 'pass' THEN 1 END) as [pass]
FROM Students
GROUP BY school
ORDER BY school

Я не уверен, есть ли какой-либо выигрыш в производительности со вторым запросом. Мое предположение было бы, если есть, это, вероятно, очень мало. Я склонен использовать первый запрос, потому что думаю, что он более понятен, но оба должны работать. Кроме того, у меня нет экземпляра MySql, с которым удобно тестировать, но согласно @Johan предложения ORDER BY не нужны.

1 голос
/ 12 мая 2011
SELECT q.school, q.fail, q.failpass-q.fail as pass
FROM
  (
  SELECT s.school, sum(if(status = 'fail',1,0)) as fail, count(*) as failpass
  FROM students s
  GROUP BY s.school
  ) q

Таким образом вы сохраняете одну условную сумму.
В MySQL GROUP BY уже упорядочивает результаты, поэтому отдельный ORDER BY не требуется.

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