Mysql
 sql >> Baza danych >  >> RDS >> Mysql

pobierz dane pogrupowane według miesięcy przy użyciu interwału mysql

Spróbuj tego

SELECT d.y, d.m, p.cnt 
FROM 
    (SELECT a.y, b.m 
    FROM (SELECT 2015 AS Y UNION ALL SELECT 2014 AS Y) a
    CROSS JOIN (SELECT 1 AS m UNION ALL SELECT 2 AS m UNION ALL SELECT 3 AS m UNION ALL SELECT 4 AS m UNION ALL SELECT 5 AS m UNION ALL SELECT 6 AS m UNION ALL SELECT 7 AS m UNION ALL SELECT 8 AS m UNION ALL SELECT 9 AS m UNION ALL SELECT 10 AS m UNION ALL SELECT 11 AS m UNION ALL SELECT 12 AS m) b
    WHERE CONCAT(a.y, '-', b.m, '-01') BETWEEN CURDATE() - INTERVAL 13 MONTH AND CURDATE() - INTERVAL 1 MONTH
    ORDER BY 1, 2) d
    LEFT OUTER JOIN
    (SELECT YEAR(purchasedate) AS Y ,MONTH(purchasedate) AS m, COUNT(*) cnt FROM purchase WHERE productid=1001 AND purchasedate >= CURDATE() - INTERVAL 1 YEAR GROUP BY m, Y) p ON d.m=p.m AND d.y=p.y
ORDER BY 1 DESC, 2

Nie robisz nic złego, ale MySQL nie może zwrócić wierszy z miesięcy, które nie istnieją w Twoim zbiorze danych. Aby rozwiązać ten problem, musisz zapewnić sobie wszystkie miesiące (tabela d w tym zapytaniu) i LEFT JOIN z wynikami z Twojego zbioru danych




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL WYBIERZ LIKE lub REGEXP, aby dopasować wiele słów w jednym rekordzie

  2. Niepożądany wynik z db:raw

  3. podzapytanie (niepoprawne argumenty PRZECIW) przy użyciu Mysql

  4. Dwa zapytania wstawiające z połączonymi polami

  5. PostgreSQL:poprawna próbka przypisania zmiennej?