Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL - hitung berdasarkan bulan (termasuk catatan yang hilang)

Anda perlu membuat semua tanggal yang diinginkan, dan kemudian bergabung dengan data Anda ke tanggal. Perhatikan juga bahwa penting untuk meletakkan beberapa predikat di kiri gabungan ON klausa, dan lainnya di WHERE klausa:

SELECT
  CONCAT(y, '-', LPAD(m, 2, '0')) as byMonth,
  COUNT(`created`) AS Total 
FROM (
  SELECT year(now())     AS y UNION ALL
  SELECT year(now()) - 1 AS y 
) `years`
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
) `months`
LEFT JOIN `qualitaet` q
ON YEAR(`created`) = y 
  AND MONTH(`created`) = m
  AND `status` = 1
WHERE STR_TO_DATE(CONCAT(y, '-', m, '-01'), '%Y-%m-%d') 
    >= MAKEDATE(year(now()-interval 1 year),1) + interval 5 month
  AND STR_TO_DATE(CONCAT(y, '-', m, '-01'), '%Y-%m-%d') 
    <= now()
GROUP BY y, m
ORDER BY y, m

Bagaimana cara kerja di atas?

  • CROSS JOIN membuat produk kartesius antara semua tahun yang tersedia dan semua bulan yang tersedia. Inilah yang Anda inginkan, Anda ingin semua kombinasi tahun-bulan tanpa jeda.
  • LEFT JOIN menambahkan semua qualitaet mencatat hasil (jika ada) dan menggabungkannya ke produk kartesius tahun-bulan dari sebelumnya. Penting untuk menempatkan predikat seperti status = 1 predikat di sini.
  • COUNT(created) hanya menghitung nilai non-NULL dari created , yaitu ketika LEFT JOIN tidak menghasilkan baris untuk tahun-bulan tertentu, kami ingin 0 sebagai hasilnya, bukan 1 , yaitu kita tidak ingin menghitung NULL nilai.

Catatan tentang performa

Di atas banyak menggunakan operasi string dan aritmatika waktu tanggal di ON . Anda dan WHERE predikat. Ini tidak akan berfungsi untuk banyak data. Dalam hal ini, sebaiknya Anda melakukan pra-pemotongan dan mengindeks tahun-bulan Anda di qualitaet tabel, dan hanya beroperasi pada nilai tersebut.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Buat jumlah ROLLING selama periode waktu tertentu di mysql

  2. Apakah ada manfaat nyata menggunakan RDBMS vs. file datar pada sistem dokumen Web sederhana (atau CMS dasar)?

  3. Fungsi MySQL mengembalikan nilai dari kueri

  4. masalah instalasi mysql-python (di mac os x lion)

  5. Panduan menggunakan Sphinx dengan PHP dan MySQL