Saya bertanya-tanya bagaimana cara menulis kueri ini.
Saya tahu sintaks yang sebenarnya ini palsu, tetapi ini akan membantu Anda memahami apa yang saya inginkan. Saya membutuhkannya dalam format ini, karena ini adalah bagian dari permintaan yang jauh lebih besar.
SELECT distributor_id,
COUNT(*) AS TOTAL,
COUNT(*) WHERE level = 'exec',
COUNT(*) WHERE level = 'personal'
Saya perlu ini semua dikembalikan dalam satu permintaan.
Selain itu, harus dalam satu baris, sehingga yang berikut ini tidak akan berfungsi:
'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'
Jawaban:
Anda bisa menggunakan
CASE
pernyataan dengan fungsi agregat. Ini pada dasarnya sama denganPIVOT
fungsi pada beberapa RDBMS:sumber
COUNT
akan dihitungdistributor_id
bijak. tidak semua baris tabel, kan?Salah satu cara yang pasti berhasil
EDIT:
Lihat uraian kinerja @ KevinBalmforth untuk alasan mengapa Anda mungkin tidak ingin menggunakan metode ini dan sebagai gantinya harus memilih jawaban @ Taryn. Saya meninggalkan ini sehingga orang dapat memahami pilihan mereka.
sumber
sum(case...)
solusi harus dipertimbangkan.group by
dengan manfaat mengganti seluruh kueri bersarang dengan sederhanacount(*)
seperti @Mihai menunjukkan - dengan penyederhanaan sintaksis hanya MySQL saja.COUNT
hanya menghitungnon null
nilai danDECODE
akan mengembalikan nilai bukan nol1
hanya jika kondisi Anda terpenuhi.sumber
distributor_id
akan ditampilkan kueri? Ini menunjukkan total 1 baris.Membangun jawaban diposting lainnya.
Kedua hal ini akan menghasilkan nilai yang benar:
Namun, kinerjanya sangat berbeda, yang jelas akan lebih relevan ketika jumlah data bertambah.
Saya menemukan bahwa, dengan asumsi tidak ada indeks yang didefinisikan pada tabel, kueri yang menggunakan SUM akan melakukan pemindaian tabel tunggal, sedangkan kueri dengan COUNT akan melakukan beberapa pemindaian tabel.
Sebagai contoh, jalankan skrip berikut:
Sorot 2 pernyataan SELECT dan klik ikon Display Estimated Execution Plan. Anda akan melihat bahwa pernyataan pertama akan melakukan satu pemindaian tabel dan yang kedua akan 4. 4. Jelas satu pemindaian tabel lebih baik dari 4.
Menambahkan indeks berkerumun juga menarik. Misalnya
SELECT pertama di atas akan melakukan satu Pemindaian Indeks Clustered. SELECT kedua akan melakukan 4 Pencarian Indeks Clustered, tetapi mereka masih lebih mahal daripada Scan Index Clustered tunggal. Saya mencoba hal yang sama di atas meja dengan 8 juta baris dan SELECT kedua masih jauh lebih mahal.
sumber
Untuk MySQL, ini dapat disingkat menjadi:
sumber
Nah, jika Anda harus memiliki semuanya dalam satu permintaan, Anda bisa melakukan penyatuan:
Atau, jika Anda dapat melakukannya setelah memproses:
Anda akan mendapatkan hitungan untuk setiap level dan perlu menjumlahkan semuanya untuk mendapatkan total.
sumber
UNION
sangat membantu saat membuat laporan yang berisi banyak contohCOUNT(*)
fungsi.#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') FROM distributors UNION SELECT COUNT() AS EXEC_COUNT FROM distributors WHERE ' at line 1
.Saya melakukan sesuatu seperti ini di mana saya hanya memberi setiap tabel nama string untuk mengidentifikasinya di kolom A, dan hitungan untuk kolom. Lalu aku menyatukan mereka semua sehingga mereka menumpuk. Hasilnya cukup menurut saya - tidak yakin seberapa efisien itu dibandingkan dengan opsi lain tetapi itu memberi saya apa yang saya butuhkan.
Hasil:
sumber
a query that I created makes ...
- di mana permintaan itu?Berdasarkan tanggapan Bluefeet yang diterima dengan nuansa tambahan menggunakan
OVER()
:Menggunakan
OVER()
apa pun di () akan memberi Anda jumlah total untuk seluruh dataset.sumber
Saya pikir ini juga bisa bekerja untuk Anda
select count(*) as anc,(select count(*) from Patient where sex='F')as patientF,(select count(*) from Patient where sex='M') as patientM from anc
dan juga Anda dapat memilih dan menghitung tabel terkait seperti ini
select count(*) as anc,(select count(*) from Patient where Patient.Id=anc.PatientId)as patientF,(select count(*) from Patient where sex='M') as patientM from anc
sumber