cari

Rumah  >  Soal Jawab  >  teks badan

Optimumkan penggunaan pernyataan CASE dalam MySQL

<p>Hello semua,</p> <p>Saya mempunyai jadual seperti yang ditunjukkan dalam tangkapan skrin di atas. Saya menulis pertanyaan menggunakan penyataan <code>CASE</code> supaya ia akan mengembalikan lajur tambahan yang saya perlukan. Berikut ialah pertanyaan yang saya tulis: </p> <pre class="brush:php;toolbar:false;">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;</pre> <p>Ini ialah jadual keputusan yang saya dapat: </p> <p>Apa yang saya ingin capai dalam pertanyaan ini ialah jika pelajar menghadiri kursus, ia akan memaparkan <kod>1</code> </p> <p>Contohnya, pelajar dengan <kod>id_pelajar</kod>2</kod>1</kod>1< Di bawah lajur ;/kod> kedua-dua baris untuk <kod>id_pelajar</kod>2</kod> </p> <p>Saya telah mencapai apa yang saya mahukan dalam pertanyaan, tetapi sekarang daripada menggunakan <kod>1</code> saya mahu ia menjadi <kod>tarikh_daftar</kod> Berikut ialah output akhir yang saya inginkan: </p> <p>Boleh saya tahu bagaimana saya harus mengubah suai pertanyaan untuk mendapatkan output akhir dalam tangkapan skrin di atas? </p> <p><strong>Soalan kedua:</strong></p> <p>Seperti yang anda lihat dalam pertanyaan di atas, setiap kelas mempunyai <code>CASE</code> 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 <code>CASE</code>Adakah saya boleh mengoptimumkan pertanyaan saya supaya saya tidak perlu mempunyai 4 <code>CASE</code> penyata untuk 4 kelas berbeza, tetapi masih boleh mencipta lajur untuk kelas yang berbeza (apabila terdapat kelas baharu , akan ada lajur baharu) kelas juga)? </p> <h2>Data Contoh</h2> <pre class="brush:php;toolbar:false;">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') ;</pre></p>
P粉463840170P粉463840170448 hari yang lalu565

membalas semua(2)saya akan balas

  • P粉670107661

    P粉6701076612023-09-05 12:32:12

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

    balas
    0
  • P粉785522400

    P粉7855224002023-09-05 00:46:12

    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;

    balas
    0
  • Batalbalas