Rumah  >  Soal Jawab  >  teks badan

Isu MySQL apabila meringkaskan data jualan daripada dua jadual berasingan

Terima kasih terlebih dahulu atas sokongan anda. Saya sedang belajar SQL dan menjana beberapa data untuk dimainkan, tetapi saya terperangkap pada satu perkara mudah. Jadual dalam tangkapan skrin di bawah menunjukkan sebahagian daripada jadual jualan20 saya, yang menunjukkan jualan yang dicapai oleh setiap pekerja pada tahun 2020 berserta maklumat wilayah dan tarikh.

Jualan Meja 20

Saya mempunyai jadual yang sama dari 2021. Apa yang saya mahu lakukan ialah; saya ingin memberikan nama pekerja, wilayah, jumlah jualan yang dicapai oleh pekerja pada tahun 2020 dan 2021. Saya menulis pertanyaan berikut tetapi ia tidak memberikan nombor yang betul. Ia membawa sesuatu yang lebih tinggi daripada yang sepatutnya. Perkara penting ialah pekerja pada 2020 dan 2021 adalah berbeza. Sebagai contoh, terdapat pekerja baharu pada tahun 2021, bermakna dia harus disenaraikan juga, tetapi lajur 2020 untuk pekerja itu hendaklah kosong.

Pertanyaan saya:

SELECT sales20.staff, 
       sales20.region,
       SUM(sales20.amount) AS Total_20,
       SUM(sales21.amount) AS Total_21
  FROM sales20
  JOIN sales21 ON sales20.staff = sales21.staff
 GROUP BY staff, region

Tangkapan skrin separa keputusan:

Hasil:

Boleh beritahu saya apa salah saya?

P粉391677921P粉391677921178 hari yang lalu357

membalas semua(2)saya akan balas

  • P粉476475551

    P粉4764755512024-04-05 11:55:05

    Apabila anda perlu menggabungkan dua jadual, anda akan menyertainya -

    SELECT staff, 
           region,
           SUM(IF(YEAR(saledate) = '2020',amount,0) AS Total_20,
           SUM(IF(YEAR(saledate) = '2021',amount,0) AS Total_21,
      FROM (SELECT staff, region, amount, saledate
              FROM sales20
             UNION ALL
            SELECT staff, region, amount, saledate
              FROM sales21)
     GROUP BY staff, region;

    balas
    0
  • P粉138871485

    P粉1388714852024-04-05 00:24:31

    SELECT sales20.staff,
           sales20.region,
           SUM(sales20.amount) AS Total_20,
           SUM(sales21.amount) AS Total_21
    FROM sales20
      JOIN sales21
        ON sales20.staff = sales21.staff
       AND sales20.region = sales21.region
    GROUP BY staff,
             region

    Anda perlu menyertai 2 jadual berdasarkan orang dan wilayah untuk penyertaan satu lawan satu. Jika anda menyertai hanya berdasarkan pekerja maka ia akan melakukan satu kepada banyak penyertaan supaya anda akan mendapat output yang rosak.

    Pendekatan lain ialah menggabungkan data daripada kedua-dua jadual dan kemudian melakukan pengagregatan atas dasar itu. Ini sepatutnya memberi anda hasil yang tepat.

    WITH combined_data AS
    (
      SELECT staff,
             region,
             saledate,
             amount
      FROM sales20
      UNION ALL
      SELECT staff,
             region,
             saledate,
             amount
      FROM sales21
    )
    SELECT staff,
           region,
           SUM(CASE WHEN year(saledate) = 2020 THEN amount ELSE 0 END) AS Total_20,
           SUM(CASE WHEN year(saledate) = 2021 THEN amount ELSE 0 END) AS Total_21
    FROM combined_data
    GROUP BY staff,
             region

    balas
    0
  • Batalbalas