Optimumkan penggunaan pernyataan CASE dalam MySQL
P粉463840170
P粉463840170 2023-09-04 18:42:48
0
2
483

Hello semua,

Saya mempunyai jadual seperti yang ditunjukkan dalam tangkapan skrin di atas. Saya menulis pertanyaan menggunakan penyataan CASE supaya ia akan mengembalikan lajur tambahan yang saya perlukan. Berikut ialah pertanyaan yang saya tulis:

SELECT *, KES BILA (JUMLAH(KES WHEN kelas = 'kelas 1' KEMUDIAN 1 TAMAT) BERAKHIR(PARTITITION OLEH student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 1', KES BILA (JUMLAH(KES KETIKA kelas = 'kelas 2' KEMUDIAN 1 TAMAT) BERAKHIR(PARTITITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Kelas 2', KES BILA (JUMLAH(KES KETIKA kelas = 'kelas 3' KEMUDIAN 1 TAMAT) BERAKHIR(PARTITITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Kelas 3', KES BILA (JUMLAH(KES KETIKA kelas = 'kelas 4' KEMUDIAN 1 TAMAT) BERAKHIR(PARTITITION BY student_id)) >= 1 THEN 1 LAIN 0 TAMAT SEBAGAI 'Kelas 4' DARI qa;

Ini ialah jadual keputusan yang saya dapat:

Apa yang saya ingin capai dalam pertanyaan ini ialah jika pelajar menghadiri kursus, ia akan memaparkan 1

Contohnya, pelajar dengan id_pelajar211< Di bawah lajur ;/kod> kedua-dua baris untuk id_pelajar2

Saya telah mencapai apa yang saya mahukan dalam pertanyaan, tetapi sekarang daripada menggunakan 1 saya mahu ia menjadi tarikh_daftar Berikut ialah output akhir yang saya inginkan:

Boleh saya tahu bagaimana saya harus mengubah suai pertanyaan untuk mendapatkan output akhir dalam tangkapan skrin di atas?

Soalan kedua:

Seperti yang anda lihat dalam pertanyaan di atas, setiap kelas mempunyai CASE penyataan yang berasingan untuk membuat lajur untuk kelas itu. Walau bagaimanapun, pada masa hadapan mungkin terdapat 5,6,7,... kelas, jadi apabila terdapat kelas baharu yang berbeza, saya perlu menambah penyata CASEAdakah saya boleh mengoptimumkan pertanyaan saya supaya saya tidak perlu mempunyai 4 CASE penyata untuk 4 kelas berbeza, tetapi masih boleh mencipta lajur untuk kelas yang berbeza (apabila terdapat kelas baharu , akan ada lajur baharu) kelas juga)?

Data Contoh

buat jadual qa( student_id INT, kelas varchar(20), tarikh_tarikh_akhir_kelas, tarikh_daftar_tarikh ); masukkan ke dalam qa (id_pelajar, kelas, tarikh_akhir_kelas, tarikh_pendaftaran) nilai (1, 'kelas 1', '2022-03-03', '2022-02-14'), (1, 'kelas 3', '2022-06-13', '2022-04-12'), (1, 'kelas 4', '2022-07-03', '2022-06-19'), (2, 'kelas 1', '2023-03-03', '2022-07-14'), (2, 'kelas 2', '2022-08-03', '2022-07-17'), (4, 'kelas 4', '2023-03-03', '2022-012-14'), (4, 'kelas 2', '2022-04-03', '2022-03-21') ;

P粉463840170
P粉463840170

membalas semua (2)
P粉670107661

LihatPivotuntuk prosedur tersimpan yang akan menjana dan [secara pilihan] menjalankan pertanyaan berdasarkan definisi jadual dan data.

    P粉785522400

    Ini ialah contoh yang mengandungi tarikh_akhir_kelas dan tarikh_pendaftaran -

    SELECT student_id, GROUP_CONCAT(IF(class = 'class 1', enrollment_date, null)) 'Class 1 Enrolled', GROUP_CONCAT(IF(class = 'class 1', class_end_date, null)) 'Class 1 End', GROUP_CONCAT(IF(class = 'class 2', enrollment_date, null)) 'Class 2 Enrolled', GROUP_CONCAT(IF(class = 'class 2', class_end_date, null)) 'Class 2 End', GROUP_CONCAT(IF(class = 'class 3', enrollment_date, null)) 'Class 3 Enrolled', GROUP_CONCAT(IF(class = 'class 3', class_end_date, null)) 'Class 3 End', GROUP_CONCAT(IF(class = 'class 4', enrollment_date, null)) 'Class 4 Enrolled', GROUP_CONCAT(IF(class = 'class 4', class_end_date, null)) 'Class 4 End' FROM qa GROUP BY student_id;
      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!