Saya memiliki tabel SQL Server yang berisi pengguna & nilainya. Demi kesederhanaan, katakan saja ada 2 kolom - name
& grade
. Jadi baris yang khas adalah Name: "John Doe", Grade: "A".
Saya mencari satu pernyataan SQL yang akan menemukan persentase dari semua jawaban yang mungkin. (A, B, C, dll ...) Juga, apakah ada cara untuk melakukan ini tanpa mendefinisikan semua kemungkinan jawaban (bidang teks terbuka - pengguna dapat memasukkan 'lulus / gagal', 'tidak ada', dll ...)
Output akhir yang saya cari adalah A: 5%, B: 15%, C: 40%, dll ...
sql
sql-server
tsql
Alex
sumber
sumber
Yang paling efisien (menggunakan lebih ()).
Universal (semua versi SQL).
Dengan CTE, yang paling tidak efisien.
sumber
cast((count(*) / (sum(count(*)) over() / 100)) AS DECIMAL(18, 2)) as Percentage
over()
karya hebat di Postgresql 10Alih-alih menggunakan CTE terpisah untuk mendapatkan total, Anda dapat menggunakan fungsi jendela tanpa klausa "partisi dengan".
Jika Anda menggunakan:
untuk mendapatkan hitungan untuk grup, Anda dapat menggunakan:
untuk mendapatkan jumlah total.
Sebagai contoh:
Ini cenderung lebih cepat dalam pengalaman saya, tetapi saya pikir itu mungkin secara internal menggunakan tabel temp dalam beberapa kasus (saya telah melihat "Meja Kerja" ketika menjalankan dengan "set statistik io on").
EDIT: Saya tidak yakin apakah contoh permintaan saya adalah apa yang Anda cari, saya baru saja menggambarkan cara kerja fungsi windowing.
sumber
tempdb
mana adalah tabel kerja. Bacaan logis tampaknya lebih tinggi tetapi mereka dihitung secara berbeda dari biasanyaCOUNT(*) OVER ()
dalam kueri Anda akan mengembalikan angka yang sama sekali tidak terkait (khususnya, jumlah baris dari set hasil yang dikelompokkan ). Anda harus menggunakannyaSUM(COUNT(*)) OVER ()
sebagai gantinya.Anda harus menghitung total nilai. Jika itu SQL 2005, Anda dapat menggunakan CTE
sumber
Anda perlu mengelompokkan pada bidang nilai. Kueri ini akan memberi Anda apa yang Anda cari di hampir semua basis data.
Anda harus menentukan sistem yang Anda gunakan.
sumber
Saya hanya menggunakan ini kapan pun saya perlu menghitung persentase ..
Perhatikan bahwa 100.0 menghasilkan desimal, sedangkan 100 itu sendiri akan mengumpulkan hasilnya ke bilangan bulat terdekat, bahkan dengan fungsi ROUND ()!
sumber
Berikut ini harus bekerja
EDIT: Memindahkan
* 100
dan menambahkan1.0
untuk memastikan tidak melakukan pembagian integersumber
Ini, saya percaya, solusi umum, meskipun saya mengujinya menggunakan IBM Informix Dynamic Server 11.50.FC3. Pertanyaan berikut:
memberikan output berikut pada data uji yang ditunjukkan di bawah aturan horizontal. The
ROUND
Fungsi mungkin DBMS-spesifik, tapi sisa (mungkin) tidak. (Perhatikan bahwa saya mengubah 100 menjadi 100.0 untuk memastikan bahwa perhitungan terjadi menggunakan non-integer - DECIMAL, NUMERIC - aritmatika; lihat komentar, dan terima kasih kepada Thunder.)sumber
sumber
Dalam versi server sql apa pun, Anda dapat menggunakan variabel untuk total semua nilai seperti ini:
sumber
Anda dapat menggunakan sub-pilihan dalam kueri dari Anda (belum teruji dan tidak yakin mana yang lebih cepat):
Atau
Atau
Anda juga dapat menggunakan prosedur tersimpan (permintaan maaf untuk sintaks Firebird):
sumber
Saya memiliki masalah yang mirip dengan ini. Anda harus bisa mendapatkan hasil yang benar dengan mengalikan dengan 1,0 bukannya 100. Lihat contoh Gambar terlampir
Pilih Nilai, (Hitung (Nilai) * 1.0 / (Pilih Hitung (*) Dari MyTable)) sebagai Skor Dari Grup MyTable Dengan Nilai
sumber
Yang ini bekerja dengan baik di MS SQL. Ini mengubah varchar menjadi hasil dari float terbatas dua desimal-tempat-terbatas.
sumber