Нужна какая-то "условная группировка" в MySQL - PullRequest
1 голос
/ 02 июня 2010

У меня есть таблица статей:

id | type | date
-----------------------
 1 | A    | 2010-01-01
 2 | A    | 2010-01-01
 3 | B    | 2010-01-01

Поле type может быть A, B или C.

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

date       | count(type="A") | count(type="B") | count(type="C")
-----------------------------------------------------
2010-01-01 | 2               | 1               | 0
2010-01-02 | 5               | 6               | 7

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

select date, count(id) from article where type="A" group by date

Возможно ли сделать это одним запросом? (в чистом sql нет хранимых процедур или чего-то в этом роде).

Спасибо

Ответы [ 2 ]

8 голосов
/ 02 июня 2010

Комбинация SUM и CASE должна сделать ya

select date
    , sum(case when type ='A' then 1 else 0 end) as count_type_a 
    , sum(case when type ='B' then 1 else 0 end) as count_type_b
    , sum(case when type ='C' then 1 else 0 end) as count_type_c 
from article group by date
1 голос
/ 02 июня 2010

РЕДАКТИРОВАТЬ: Ответ Алекса выше использует лучший подход, чем в этом ответе. Я оставляю это здесь только потому, что это также удовлетворяет вопрос, альтернативным способом:


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

SELECT    DATE(a.date) as date,
          (SELECT COUNT(a1.id) FROM articles a1 WHERE a1.type = 'A' AND a1.date = a.date) count_a,
          (SELECT COUNT(a2.id) FROM articles a2 WHERE a2.type = 'B' AND a2.date = a.date) count_b,
          (SELECT COUNT(a3.id) FROM articles a3 WHERE a3.type = 'C' AND a3.date = a.date) count_c
FROM      articles a
GROUP BY  a.date;

Контрольный пример:

CREATE TABLE articles (id int, type char(1), date datetime);

INSERT INTO articles VALUES (1, 'A', '2010-01-01');
INSERT INTO articles VALUES (2, 'A', '2010-01-01');
INSERT INTO articles VALUES (3, 'B', '2010-01-01');
INSERT INTO articles VALUES (4, 'B', '2010-01-02');
INSERT INTO articles VALUES (5, 'B', '2010-01-02');
INSERT INTO articles VALUES (6, 'B', '2010-01-03');
INSERT INTO articles VALUES (7, 'B', '2010-01-01');
INSERT INTO articles VALUES (8, 'C', '2010-01-05');

Результат:

+------------+---------+---------+---------+
| date       | count_a | count_b | count_c |
+------------+---------+---------+---------+
| 2010-01-01 |       2 |       2 |       0 |
| 2010-01-02 |       0 |       2 |       0 |
| 2010-01-03 |       0 |       1 |       0 |
| 2010-01-05 |       0 |       0 |       1 |
+------------+---------+---------+---------+
4 rows in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...