2013-08-29 1 views
0

У меня есть таблица вроде этого:MySQL группировка по типу, а затем нарезка на диапазоны дат в столбцах

+----+------+-------------+ 
| id | type | date  | 
+----+------+-------------+ 
| 1 | abc | [some date] | 
| 2 | def | [some date] | 
| 3 | abc | [some date] | 
| 4 | abc | [some date] | 
| 5 | xyz | [some date] | 
+----+------+-------------+ 

И я пытаюсь в результате, как это:

+------+-----------+------------+-----------+ 
| type | last year | last month | last week | 
+------+-----------+------------+-----------+ 
| abc |  5489 |  355 |  101 | 
| def |  2235 |  115 |  59 | 
| xyz |  1998 |  180 |  75 | 
+------+-----------+------------+-----------+ 

Где номера представляют количество строк соответствующего типа в заданном диапазоне дат.

Я попытался вещи вдоль этих линий:

SELECT type, 
    (SELECT count(*) FROM table WHERE [date last year]) AS `last year`, 
    (SELECT count(*) FROM table WHERE [date last month]) AS `last month`, 
    (SELECT count(*) FROM table WHERE [date last week]) AS `last week` 
FROM table 
GROUP BY type 

Но возвратили же число (общее количество в заданном диапазоне дат) для каждого типа. Когда я добавил оператор GROUP BY в подвыборки, у меня появилась ошибка, говорящая, что подзаголовок возвратил более одной строки.

Так как я могу это решить?

спасибо, что заблаговременно!

ответ

1

Вы хотите условную агрегацию:

SELECT type, 
     sum([date last year]) AS `last year`, 
     sum([date last year]) AS `last year`, 
     sum([date last month]) AS `last month`, 
     sum([date last week]) AS `last week` 
FROM table 
GROUP BY type; 

То есть, поставить свою логику в sum() - Ваш вопрос предполагает, что вы понимаете, что логика.

Смежные вопросы