2011-11-04 24 views
6

Bunu aramak için çok zaman harcadım, lütfen çoğaltıp vermeme izin verin.SQL: Toplam tablo satır sayısının toplam sayısı olarak * (*) grubuna göre

Her kategorinin sayısıyla birlikte kayıt kategorilerini döndüren gruplandırılmış bir sorgu yazmam gerekiyor. Bunun gibi bir şey: Şimdiye kadar çok iyi. Şimdi ihtiyacım olan şey, her kategorinin toplamının yüzde kaçının kapladığıdır.

select categorynum, count(*), count(*)/(select count(*) from tbl) from tbl group by categorynum; 

O inşaat, ama gerçekten bu şekilde yapmak için başımın etini oluyor: Ben ile gelip en iyi ben sevmiyorum hangi budur, kirli hissediyor. Kullandığım veritabanı Postgres sözdizimi uyumludur ve tablodaki count(*) gerçekten hızlıdır, bu yüzden tablo üzerinde count(*) yapmak için büyük bir hız vuruşu yoktur, ancak eğer mümkün olursa daha iyi SQL yazmak istiyorum.

Bunu yazmanın daha iyi bir yolu var mı? Sıklıkla karşılaştığım bir durum bu yüzden sorgularımı doğru şekilde yazmak istiyorum.

cevap

5

PostgreSQL pencere fonksiyonları desteklediği için böyle bir şey yapabileceğini:

select categorynum,count,100*count/(sum(count) over())::numeric as count_pct 
from(
    select categorynum,count(1) 
    from tbl 
    group by categorynum 
)a; 
+0

Bu, orijinalden daha karmaşıktır, ancak daha hızlı çalışır mı? Bu sorgu türünde çok sayıda potansiyel uygulama var, işaretçi için teşekkürler! –

+0

Eğer 'tlist' satır sırasına göre 'kategorileme' birkaç değeri varsa, o zaman işin çoğu alt sorguda yapılacaktır. 'Tbl' satır sırasına göre farklı "kategoriler" oranı nispeten yüksekse, o zaman "toplamı" sizi çok yavaşlatabilir. Sorgu planını her iki sorgunun bir 'açıklaması' üzerinden kontrol ederdim. Ve çok hoş geldiniz. :) –

1

Ayrıca, farklı bir sorgu olarak masaya sayısı (*) yapmak ve daha sonra orijinal sorgu ile o katılabilir SELECT ifadenizin bir bölümünden. Bu SELECT kısmına koymadan daha hızlı olmalıdır.

select categorynum, categorycount, total 
from (select categorynum, count(*) as categorycount 
     from tbl 
     group by categorynum) categories, 
    (select count(*) as total from tbl) totals 
+0

Teşekkürler, daha önce sahip olduğum tek seçenek buydu ... Bu tablo her zaman ona veri ekleniyor ve ayrıca iki sorguyu çalıştırmak ve daha sonra sayıları yazmak zorunda olmaktan çok tek bir sorguya sahip olmak isterim. yüzdelerini almak için bir hesap makinesi/elektronik tabloya. –

+0

Cevap verenin aklında tek bir sorguya sahip olduğunu düşünüyorum ... Cevapların okunacağı yerlere bir öneri yazacağım. – araqnid

+0

yeni eklediğim örnek sorudaki örneğinizden daha etkili olmamasına rağmen, her ikisi de tablonun iki tam taramasıyla sonuçlanır. İyi, bu şeyler sadece onları deneyerek öğrenildi. – araqnid

İlgili konular