sql >> Databasteknik >  >> RDS >> PostgreSQL

Beräkna procent från SUM() i samma SELECT sql-fråga

Det finns mer i denna fråga än vad det kan verka.

Enkel version

Det här är mycket snabbare och enklare:

SELECT property_name
      ,(count(value_a = value_b OR NULL) * 100) / count(*) AS pct
FROM   my_obj
GROUP  BY 1;

Resultat:

property_name | pct
--------------+----
 prop_1       | 17
 prop_2       | 43

Hur?

  • Du behöver ingen funktion för detta alls.

  • Istället för att räkna value_b (vilket du inte behöver till att börja med) och beräkna summan, använd count(*) för det totala. Snabbare, enklare.

  • Detta förutsätter att du inte har NULL värden. d.v.s. båda kolumnerna är definierade NOT NULL . Informationen saknas i din fråga.
    Om inte gör din ursprungliga fråga förmodligen inte som du tror att den gör . Om något av värdena är NULL, räknar din version inte den raden alls. Du kan till och med provocera fram en division-för-noll undantag på detta sätt.
    Denna version fungerar också med NULL. count(*) producerar räkningen av alla rader, oavsett värden.

  • Så här fungerar räkningen:

     TRUE  OR NULL = TRUE
     FALSE OR NULL = NULL
    

    count() ignorerar NULL-värden. Voilá.

  • Operatörsföreträde styr den = binder före OR . Du kan lägga till parenteser för att göra det tydligare:

    count ((value_a = value_b) OR FALSE)
    
  • Du kan göra samma sak med

    count NULLIF(<expression>, FALSE)
    
  • Resultattypen count() är bigint som standard.
    En division bigint / bigint , kortar av bråksiffror .

Inkludera bråksiffror

Använd 100.0 (med bråktal) för att tvinga beräkningen att vara numeric och därigenom bevara bråksiffror.
Du kanske vill använda round() med detta:

SELECT property_name
      ,round((count(value_a = value_b OR NULL) * 100.0) / count(*), 2) AS pct
FROM   my_obj
GROUP  BY 1;

Resultat:

property_name | pct
--------------+-------
 prop_1       | 17.23
 prop_2       | 43.09

Som en sida:
Jag använder value_a istället för valueA . Använd inte identifierare med blandade skiftlägen utan citat i PostgreSQL. Jag har sett för många desperata frågor komma från denna dårskap. Om du undrar vad jag pratar om, läs kapitlet Identifierare och nyckelord i manualen.



  1. AWS RDS Säkerhetskopieringsmetoder

  2. Hur man skapar ett tillägg för SSMS 2019 (v18)

  3. MySQL kombinera två kolumner och lägg till en ny kolumn

  4. Hur returnerar man flera värden i en kolumn (T-SQL)?