Оптимизировать запрос по месяцам

В таблице есть поле "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
→ Ссылка