Оптимизировать запрос по месяцам
В таблице есть поле "Activity" в котором, по факту, записывается штамп времени. Мне нужно за определенный год (допустим 2020) вывести количество записей по месяцам. Результатом должна быть запись с 12-ю полями. Я составил вот такой запрос:
SELECT
SUM(F1) AS 'M1',
SUM(F2) AS 'M2',
SUM(F3) AS 'M3',
SUM(F4) AS 'M4',
SUM(F5) AS 'M5',
SUM(F6) AS 'M6',
SUM(F7) AS 'M7',
SUM(F8) AS 'M8',
SUM(F9) AS 'M9',
SUM(F10) AS 'M10',
SUM(F11) AS 'M11',
SUM(F12) AS 'M12'
FROM (
SELECT
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '01' THEN COUNT(G.Activity) ELSE 0 END AS 'F1',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '02' THEN COUNT(G.Activity) ELSE 0 END AS 'F2',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '03' THEN COUNT(G.Activity) ELSE 0 END AS 'F3',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '04' THEN COUNT(G.Activity) ELSE 0 END AS 'F4',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '05' THEN COUNT(G.Activity) ELSE 0 END AS 'F5',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '06' THEN COUNT(G.Activity) ELSE 0 END AS 'F6',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '07' THEN COUNT(G.Activity) ELSE 0 END AS 'F7',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '08' THEN COUNT(G.Activity) ELSE 0 END AS 'F8',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '09' THEN COUNT(G.Activity) ELSE 0 END AS 'F9',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '10' THEN COUNT(G.Activity) ELSE 0 END AS 'F10',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '11' THEN COUNT(G.Activity) ELSE 0 END AS 'F11',
CASE WHEN strftime('%m', datetime(G.Activity, 'unixepoch')) = '12' THEN COUNT(G.Activity) ELSE 0 END AS 'F12'
FROM Guests AS G
WHERE strftime('%Y', datetime(G.Activity, 'unixepoch')) = '2020'
GROUP BY strftime('%m', datetime(G.Activity, 'unixepoch'))
)
Запрос работает правильно. Но мне кажется, что он получился уж слишком громоздким. Можно ли его переписать/оптимизировать?
Ответы (1 шт):
Автор решения: Ainar-G
→ Ссылка
Почему просто не разверунть таблицу?
SELECT strftime('%m', datetime(activity, 'unixepoch')) AS month
, COUNT(activity) AS count
FROM guests
GROUP BY strftime('%m', datetime(activity, 'unixepoch'))
;
Пример ответа:
month|count 01|1 02|1 05|1 09|2