Bagaimanakah saya boleh mengira nilai purata untuk setiap \'pass\' untuk \'id\' yang sama dan memutar data untuk satu baris setiap \'id\' dalam SQL?

Linda Hamilton
Lepaskan: 2024-10-25 18:09:02
asal
395 orang telah melayarinya

How can I calculate average values for each 'pass' for the same 'id' and pivot the data for one row per 'id' in SQL?

Pertanyaan SQL dengan AVG dan GROUP BY

Dalam SQL, anda mungkin menghadapi situasi di mana anda perlu mengekstrak purata berkumpulan daripada jadual. Ini boleh dicapai menggunakan klausa AVG() dan GROUP BY.

Pertimbangkan jadual contoh:

id pass val
DA02959106 5.00 44.40
08A5969201 1.00 182.41
08A5969201 2.00 138.78
DA02882103 5.00 44.73
DA02959106 1.00 186.15
DA02959106 2.00 148.27
DA02959106 3.00 111.91
DA02959106 4.00 76.15
DA02959106 5.00 44.40
DA02959106 4.00 76.65

Mengira Nilai Purata untuk Setiap Pas

Untuk mengira nilai purata bagi setiap 'lulus' bagi 'id' yang sama, gunakan pertanyaan berikut:

<code class="sql">SELECT id, pass, AVG(val) AS val_1
FROM data_r1
GROUP BY id, pass;</code>
Salin selepas log masuk

Pertanyaan ini mengumpulkan baris mengikut 'id' dan 'lulus' serta mengira purata 'val' bagi setiap kumpulan. Hasilnya ialah:

id pass val_1
DA02959106 1.00 186.15
08A5969201 1.00 182.41
DA02882103 5.00 44.73
08A5969201 2.00 138.78
DA02959106 2.00 148.27
DA02959106 3.00 111.91
DA02959106 4.00 76.40
DA02959106 5.00 44.40

Mengasingkan Data untuk Satu Baris setiap ID

Jika anda lebih suka mempunyai satu baris setiap 'id' dengan berbilang lajur yang mewakili nilai purata bagi setiap 'lulus', gunakan pertanyaan berikut:

<code class="sql">SELECT d1.id,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 1) as val_1,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 2) as val_2,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 3) as val_3,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 4) as val_4,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 5) as val_5,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 6) as val_6,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 7) as val_7
from data_r1 d1
GROUP BY d1.id;</code>
Salin selepas log masuk

Pertanyaan ini menggunakan subkueri untuk mengekstrak nilai purata bagi setiap 'lulus' dan memberikannya kepada lajur yang sepadan. Jadual yang terhasil ialah:

id val_1 val_2 val_3 val_4 val_5 val_6 val_7
DA02959106 186.15 148.27 111.91 76.40 44.40 0 0

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengira nilai purata untuk setiap \'pass\' untuk \'id\' yang sama dan memutar data untuk satu baris setiap \'id\' dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
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!