Lebih
Cara menghitung persentase dengan pernyataan SQL
Saya punya tabel SQL Server yang berisi pengguna & nilai-nilai mereka. Untuk kesederhanaan's sake, memungkinkan hanya mengatakan ada 2 kolom - nama
& kelas
. Begitu khas-turut akan Nama: "John Doe", Kelas:"A".
I'm mencari satu pernyataan SQL yang akan menemukan persentase dari semua kemungkinan jawaban. (A, B, C, dll...) Juga, apakah ada cara untuk melakukan hal ini tanpa menentukan semua kemungkinan jawaban (open bidang teks - pengguna bisa memasukkan 'lulus/gagal', 'ada', dll...)
Hasil akhir I'm tempat ideal untuk: 5%, B: 15%, C: 40%, dll...
157
11
Saya telah diuji sebagai berikut dan ini tidak bekerja. Jawaban oleh gordyii dekat tapi memiliki kelipatan 100 di tempat yang salah dan hilang kurung.
pilih Kelas, count() 100.0 / sum(count(*)) lebih dari() dari MyTable group by Kelas
pilih Kelas, count() 100.0 / (select count(*) from MyTable) dari MyTable group by Kelas;
dengan t(Kelas, GradeCount) sebagai ( pilih Kelas, count() dari MyTable group by Kelas ) pilih Kelas, GradeCount 100.0/(select sum(GradeCount) dari t) dari t;
Alih-alih menggunakan terpisah CTE untuk mendapatkan total, anda dapat menggunakan fungsi jendela tanpa "partisi dengan" klausa.
Jika anda menggunakan:
untuk mendapatkan hitung untuk kelompok, anda dapat menggunakan:
untuk mendapatkan jumlah total.
Misalnya:
Hal ini cenderung menjadi lebih cepat dalam pengalaman saya, tapi saya pikir itu mungkin secara internal menggunakan tabel temp dalam beberapa kasus (I've melihat "Meja kerja" ketika berjalan dengan "set statistik io on").
EDIT: I'm tidak yakin jika saya contoh query adalah apa yang anda cari, saya hanya menggambarkan bagaimana fungsi windowing bekerja.
Yang anda butuhkan untuk kelompok di kelas lapangan. Query ini akan memberikan anda apa yang anda cari dalam setiap database.
Anda harus menentukan sistem anda're menggunakan.
Anda harus menghitung total nilai Jika SQL 2005 anda dapat menggunakan CTE
Saya hanya menggunakan ini ketika pernah saya butuhkan untuk bekerja di luar persentase..
Perhatikan bahwa 100.0 kembali desimal, sedangkan 100's sendiri akan mengumpulkan hasilnya ke seluruh nomor terdekat, bahkan dengan ROUND() fungsi!
Berikut harus bekerja
EDIT: Pindah
* 100
dan menambahkan1.0
untuk memastikan bahwa itu doesn't melakukan pembagian integerIni adalah, saya percaya, sebuah solusi umum, meskipun saya diuji menggunakan IBM Informix Dynamic Server 11.50.FC3. Query berikut:
memberikan output sebagai berikut pada data uji yang ditunjukkan di bawah aturan horizontal. Yang
BULAT
fungsi dapat DBMS yang spesifik, tapi (mungkin) tidak. (Perhatikan bahwa saya berubah 100 100,0 untuk memastikan bahwa perhitungan yang terjadi dengan menggunakan non-integer DESIMAL, ANGKA - aritmatika; lihat komentar-komentar, dan terima kasih untuk Thunder.)Anda dapat menggunakan subselect anda dari query (belum teruji dan tidak yakin mana yang lebih cepat):
Atau
Atau
Anda juga dapat menggunakan stored procedure (maaf untuk Firebird sintaks):
Di setiap versi sql server anda bisa menggunakan variabel total dari semua nilai seperti ini: