Rumah >pangkalan data >tutorial mysql >Bagaimana Mengendalikan Berbilang Baris Hasil Semasa Mengumpul dan Memesan Data dalam SQL?
Mengendalikan berbilang baris hasil dalam pengumpulan dan pengisihan SQL
Dalam pertanyaan yang mengumpulkan dan mengisih data, anda sering menghadapi situasi ini: berbilang baris dengan kunci pengelompokan yang sama, tetapi nilai berbeza untuk lajur lain. Ini boleh menghalang daripada mendapatkan data agregat yang diperlukan.
Sebagai contoh, pertanyaan yang mengumpulkan data mengikut model perkakasan mungkin mengembalikan berbilang baris dengan "hasil" berbeza untuk model yang sama. Untuk memadatkan ini menjadi satu baris setiap model, anda boleh mengubah suai pertanyaan supaya 0 nilai sebenar menghasilkan 0 nilai, dan bukan sifar nilai menghasilkan 1 nilai. Walau bagaimanapun, pendekatan ini masih menghasilkan berbilang baris untuk model dengan berbilang nilai "hasil".
Kunci untuk mencapai pengagregatan yang diingini ialah mengumpulkan mengikut ungkapan CASE dan bukannya dengan lajur sumber yang mewakili hasil. Dengan mengumpulkan mengikut nilai syarat, pertanyaan boleh menggabungkan baris dengan kunci kumpulan dan hasil syarat yang sama.
Sebagai contoh, kumpulan pertanyaan berikut mengikut nama model, jenis cubaan dan ungkapan CASE yang digunakan untuk menukar nilai hasil:
<code class="language-sql">SELECT CURRENT_DATE-1 AS day, model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END, count(*) FROM attempt attempt, prod_hw_id prod_hw_id, model model WHERE time >= '2013-11-06 00:00:00' AND time < '2013-11-07 00:00:00' GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END ORDER BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END;</code>
Sebagai alternatif, anda boleh menggunakan alias lajur bagi ungkapan CASE untuk membezakannya daripada lajur sumber hasil:
<code class="language-sql">SELECT CURRENT_DATE-1 AS day, model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1, count(*) FROM attempt attempt, prod_hw_id prod_hw_id, model model WHERE time >= '2013-11-06 00:00:00' AND time < '2013-11-07 00:00:00' GROUP BY model.name, attempt.type, result1 ORDER BY model.name, attempt.type, result1;</code>
Adalah penting untuk diingat bahawa pengumpulan mengikut ungkapan CASE menggunakan rujukan kedudukan (cth., "KUMPULAN OLEH 1,2,3") lebih tahan terhadap perubahan dalam senarai PILIH berbanding menggunakan nama lajur dalam klausa GROUP BY.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Berbilang Baris Hasil Semasa Mengumpul dan Memesan Data dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!