cari

Rumah  >  Soal Jawab  >  teks badan

Tetapkan nilai lalai untuk selang tahun dan bulan sambungan MySQL

Ada masalah dengan pertanyaan saya. Saya mempunyai dua jadual dan saya mahu menyertainya untuk mendapatkan hasil berdasarkan kunci utama pada jadual pertama, tetapi saya kehilangan 1 keping data daripada jadual pertama.

Ini biola saya

Seperti yang anda lihat, saya kehilangan "xx3" untuk bulan 1

Saya cuba menukar sambungan kiri dan kanan tetapi hasilnya masih sama. Jadi seperti yang anda lihat, saya perlu menetapkan coalesce(sum(b.sd_qty),0) 设置为总计, 如果没有 qty,则将 0 kepada nilai lalai.

P粉924915787P粉924915787334 hari yang lalu366

membalas semua(1)saya akan balas

  • P粉287726308

    P粉2877263082024-02-26 09:49:06

    Anda juga harus silang menyertai jadual ke tarikh yang berbeza:

    SELECT a.item_code,
           COALESCE(SUM(b.sd_qty), 0) total,
           DATE_FORMAT(d.sd_date, '%m-%Y') month_year
    FROM item a 
    CROSS JOIN (
      SELECT DISTINCT sd_date 
      FROM sales_details 
      WHERE sd_date >= '2020-04-01' - INTERVAL 3 MONTH AND sd_date < '2020-05-01'
    ) d 
    LEFT JOIN sales_details b 
    ON a.item_code = b.item_code AND b.sd_date = d.sd_date
    GROUP BY month_year, a.item_code
    ORDER BY month_year, a.item_code;

    Sebagai alternatif, untuk MySql 8.0+, gunakan CTE rekursif untuk mengembalikan tarikh mula semua bulan yang anda inginkan hasilnya, yang boleh dicantum silang ke jadual:

    WITH RECURSIVE dates AS (
      SELECT '2020-04-01' - INTERVAL 3 MONTH AS sd_date
      UNION ALL
      SELECT sd_date + INTERVAL 1 MONTH
      FROM dates 
      WHERE sd_date + INTERVAL 1 MONTH < '2020-05-01'
    )
    SELECT a.item_code,
           COALESCE(SUM(b.sd_qty), 0) total,
           DATE_FORMAT(d.sd_date, '%m-%Y') month_year
    FROM item a CROSS JOIN dates d 
    LEFT JOIN sales_details b 
    ON a.item_code = b.item_code AND DATE_FORMAT(b.sd_date, '%m-%Y') = DATE_FORMAT(d.sd_date, '%m-%Y')
    GROUP BY month_year, a.item_code
    ORDER BY month_year, a.item_code;

    Lihat Demo.

    balas
    0
  • Batalbalas