Rumah >pangkalan data >tutorial mysql >Bagaimana Mengendalikan Berbilang Baris Hasil Semasa Mengumpul dan Memesan Data dalam SQL?

Bagaimana Mengendalikan Berbilang Baris Hasil Semasa Mengumpul dan Memesan Data dalam SQL?

Linda Hamilton
Linda Hamiltonasal
2025-01-10 15:06:44151semak imbas

How to Handle Multiple Result Rows When Grouping and Ordering Data in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn