johnroyzreit
@johnroyzreit
PHP-developer

Как сделать выборку из базы MySQL (в результате должно быть количество записей с каждым статусом, сгруппированных по дате)?

Здравствуйте, прошу помочь в следующем вопросе.
Допустим, есть такая таблица "orders":
id | date                | status
---------------------------------
 1 | 2014-04-14 xx:xx:xx |   0
---------------------------------
 2 | 2014-04-14 xx:xx:xx |   0
---------------------------------
 3 | 2014-04-14 xx:xx:xx |   1
---------------------------------
 4 | 2014-04-13 xx:xx:xx |   1
---------------------------------
 5 | 2014-04-12 xx:xx:xx |   2

Я делаю следующую выборку:
SELECT DATE_FORMAT(date, "%d.%m.%Y") as dayOrder,
CASE WHEN status = 0 THEN COUNT(*) ELSE 0 END as new,
CASE WHEN status = 1 THEN COUNT(*) ELSE 0 END as confirmed,
CASE WHEN status = 2 THEN COUNT(*) ELSE 0 END as refusal
FROM orders
GROUP BY DATE_FORMAT(date, "%d.%m.%Y"), status

Получаю такой результат:
dayOrder    | new | confirmed | refusal
----------------------------------------
 14.04.2014 |  2  |     0     |    0
----------------------------------------
 14.04.2014 |  0  |     1     |    0
----------------------------------------
 13.04.2014 |  0  |     1     |    0
----------------------------------------
 12.04.2014 |  0  |     0     |    1

Как мне сделать выборку, чтобы привести результат к такому виду, то есть объединить все это дополнительно по дате?
dayOrder    | new | confirmed | refusal
----------------------------------------
 14.04.2014 |  2  |     1     |    0
----------------------------------------
 13.04.2014 |  0  |     1     |    0
----------------------------------------
 12.04.2014 |  0  |     0     |    1


Или, может, сделать как-то по-другому эту выборку, подскажите, пожалуйста.
  • Вопрос задан
  • 2598 просмотров
Решения вопроса 1
morozovdenis
@morozovdenis
статус уберите
SELECT DATE_FORMAT(date, "%d.%m.%Y") as dayOrder,
CASE WHEN status = 0 THEN COUNT(*) ELSE 0 END as new,
CASE WHEN status = 1 THEN COUNT(*) ELSE 0 END as confirmed,
CASE WHEN status = 2 THEN COUNT(*) ELSE 0 END as refusal
FROM orders
GROUP BY DATE_FORMAT(date, "%d.%m.%Y")


замечание: использовать агрегатные функции с условиями тяжело, если будет много записей, то запрос будет долго отрабатывать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы