Yüzdeleri (yayın sorunları) belirlemek için count () kullanarak PostgreSQL


19

Ben patientsbir değer refinstsütun benim tablonun satır% sağlamak için aşağıdaki sorguyu çalıştırmaya çalışıyorum . 0 sonucunu almaya devam ediyorum.

select (count (refinst) / (select count(*) from patients) * 100) as "Formula" 
from patients;

Tabloda 15556 satır var ve bunların 1446'sının sütunda select count(refinst) from patientsbir değeri olduğunu söylüyor refinst. Sorgudan almak istediğim yanıt 30.62 ( 1446/15556*100=30.62XXXXXiki ondalık sayıya yuvarlanmış) olacaktır.

Sayım sonuçlarının veri türü ile ilgili bir şey olduğundan eminim (varsaydığım tamsayılar). Bir tamsayıyı bir tamsayıya bölersem ve sonuç 0'dan küçükse 0'a kesilir mi? Bu durumda, biri sayımların sonuçlarını 2 ondalık basamaklı bir sayı olarak nasıl atacağımı gösterebilir, böylece sonuç da 2 ondalık basamağa yuvarlanır?

Bu kodu yazmak için birden çok sayım deyiminden daha iyi bir yol olduğundan eminim. Özellikle bu sorguyu yazmak için daha işlemci verimli bir yol arıyorum.


Belki bu cevap size yardımcı olabilir.
Jhon Anderson Cardenas Diaz

Yanıtlar:


26
SELECT (count(refinst) * 100)::numeric / count(*) AS refinst_percentage
FROM   patients;
  • Do not subselect kullanın. Her iki küme de aynı sorgudan türetilebilir. Daha ucuz.

  • Ayrıca, bu değil sen satıra bir sonuç tek bir sonuç hesaplamak istiyorum ve değil çünkü, pencere fonksiyonları için bir olgu.

  • @A_horse zaten açıklandığı gibi, kesirli basamakları destekleyen herhangi bir sayısal türe yayınlayın . İki kesirli basamağa
    istediğinizden round()eminim numeric( decimalPostgres ile aynıdır ).
    Ancak döküm için yeterli bir , tercihen ilk olarak bir hesaplama içinde yer alan değer. Postgres otomatik olarak bilgi kaybetmeyen tür için yerleşir.

  • Genellikle iyi bir fikirdir çarpın önce sen bölmek . Bu genellikle yuvarlama hatalarını en aza indirir ve daha ucuzdur.
    Bu durumda, ilk çarpma ( count(refinst) * 100) ucuz ve kesin integeraritmetik ile hesaplanabilir . Sadece o zaman biz döküm numericsonraki tarafından ve bölme integer(biz hangi değil ayrıca dökme).

İki kesirli basamağa yuvarlanır:

SELECT round((count(refinst) * 100)::numeric / count(*), 2) AS refinst_percentage
FROM   patients;

Tabii ki haklısınız, pencere fonksiyonuna gerek yok. Ama sonra gerçekten bir fark yaratmıyor (okunabilirlik dışında).
a_horse_with_no_name

3

Bölüme dahil olan her sayıyı ondalık basamakları destekleyen bir türe çevirmeniz gerekir:

select (count(refinst)::decimal / (select count(*) from patients)::decimal) * 100  as "Formula" 
from patients;

Ayrıca, skaler alt sorgusu yerine bir pencere işlevi denemek isteyebilirsiniz. Daha hızlı olabilir:

select (count(refinst)::decimal / (count(*) over ())::decimal) * 100 as "Formula" 
from patients;

0

Bu iş parçacığının birkaç yaşında olduğunu anlıyorum: ancak 100 yerine 100.0 ile çarpmayı deneyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.