Чи можна побудувати запит для створення декількох стовпців на основі декількох умов і агрегувати за часом. Наприклад, проста таблиця така:
id value created
1 45 datetime
2 52 datetime
3 24 datetime
4 33 datetime
5 20 datetime
Я можу отримати всі значення від 10 до 20 за тиждень у році так:
SELECT count(*) as "10-20", week(created) as "week", year(created) as "year"
FROM table
WHERE value > 10 AND value < 20
GROUP BY year(created), week(created)
Це дасть мені, наприклад:
10-20 week year
40 1 2014
21 2 2014
3 33 2014
Я можу повторити запит для діапазонів 20-30
,30-40
, 40-50
і вручну приєднатися до виходів, але я хотів би, щоб окремі запити об'єднували їх у таблицю, тому вихідні дані будуть:
10-20 20-30 30-40 40-50 week year
40 0 33 42 1 2014
21 1 0 2 1 2014
0 0 32 0 12 2014
3 42 34 32 33 2014
Відповіді:
1 для відповіді № 1Ви можете використовувати SUM замість COUNT, при цьому IF у дужках суми
Щось на зразок цього
SELECT SUM(IF(value > 10 AND value < 20), 1, 0) as "10-20",
SUM(IF(value > 20 AND value < 30), 1, 0) as "20-30",
SUM(IF(value > 30 AND value < 40), 1, 0) as "30-40",
SUM(IF(value > 40 AND value < 50), 1, 0) as "40-50",
week(created) as "week", year(created) as "year"
FROM table
WHERE
GROUP BY year(created), week(created)
Зауважте, що тут (і у вашому вихідному коді) існує проблема для елементів із значенням, що знаходиться на кордоні (наприклад, якщо 20).
Гнучкість мудрі ви б, мабуть, кращез іншою таблицею, в якій зберігаються діапазони, приєднатися до неї, щоб отримати один рядок на діапазон на тиждень / рік, а потім повернути рядки до стовпців сценарію. Зберігає внесення змін до коду, коли додається діапазон.