Получите ежемесячное распределение данных в пределах одной инструкции SELECT - PullRequest
0 голосов
/ 26 января 2019

Мне нужно ежемесячно распространять свои данные, используя одну единственную инструкцию mysql.Ожидаемый результат утверждения ниже: таблица с 12 строками.Если в течение одного месяца данные недоступны, он должен вернуть 0 за этот месяц.Однако в результате текущего оператора SQL одна или несколько строк отсутствуют, если отсутствуют данные.Что мне не хватает?

SELECT m.Month as m1, MONTH(FROM_UNIXTIME(crdate)) as m2,
SUM(CASE WHEN keylock = 1 THEN 1 ELSE 0 END) AS c1, SUM(CASE WHEN keylock = 2 THEN 1 ELSE 0 END) AS c2
FROM tx_bhm_domain_model_access a 
RIGHT OUTER JOIN (
    SELECT 1 AS Month 
    UNION SELECT 2 AS Month 
    UNION SELECT 3 AS Month 
    UNION SELECT 4 AS Month 
    UNION SELECT 5 AS Month 
    UNION SELECT 6 AS Month 
    UNION SELECT 7 AS Month 
    UNION SELECT 8 AS Month 
    UNION SELECT 9 AS Month
    UNION SELECT 10 AS Month 
    UNION SELECT 11 AS Month 
    UNION SELECT 12 AS Month ) m
ON MONTH(FROM_UNIXTIME(a.crdate)) = m.Month
WHERE YEAR(FROM_UNIXTIME(a.crdate))=2018 
GROUP BY m.Month
ORDER BY m.Month

1 Ответ

0 голосов
/ 26 января 2019

Сравнение YEAR() должно идти в предложении ON. Я очень предпочитаю LEFT JOIN:

SELECT m.Month as m1, MONTH(FROM_UNIXTIME(crdate)) as m2,
       SUM(CASE WHEN keylock = 1 THEN 1 ELSE 0 END) AS c1,
       SUM(CASE WHEN keylock = 2 THEN 1 ELSE 0 END) AS c2
FROM (SELECT 1 AS Month UNION ALL
      SELECT 2 AS Month UNION ALL 
      SELECT 3 AS Month UNION ALL
      SELECT 4 AS Month UNION ALL 
      SELECT 5 AS Month UNION ALL
      SELECT 6 AS Month UNION ALL
      SELECT 7 AS Month UNION ALL
      SELECT 8 AS Month UNION ALL
      SELECT 9 AS Month UNION ALL
      SELECT 10 AS Month UNION ALL
      SELECT 11 AS Month UNION ALL
      SELECT 12 AS Month
     ) m LEFT JOIN
     tx_bhm_domain_model_access a
     ON MONTH(FROM_UNIXTIME(a.crdate)) = m.Month AND
        YEAR(FROM_UNIXTIME(a.crdate)) = 2018 
GROUP BY m.Month
ORDER BY m.Month;

Я также изменил UNION с на UNION ALL с. Нет необходимости нести дубликаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...