J'ai besoin de faire un pourcentage dans Postgres mais ça ne marche pas, aidez-moi s'il vous plaît

SELECT 
   (CS1_PDM_D_Mini + CS2_PDM_D_Mini + CS3_PDM_D_Mini)  / 
 SUM(CS1_PDM_D_Mini) + SUM(CS2_PDM_D_Mini) + SUM(CS3_PDM_D_Mini)
  AS My_CS_PDM_D_Mini
FROM mytable

J'ai l'erreur suivante:

la colonne "drive.cs1_pdm_d_mini" doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation

ENFIN Modifier:

Hey mec, merci beaucoup pour votre aide, enfin, j'ai fini avec ceci:

(COALESCE(sum(Drive.CS1_PDM_D_Mini),0)+COALESCE(sum(Drive.CS2_PDM_D_Mini),0)+COALESCE(sum(Drive.CS3_PDM_D_Mini),0)) / 
CASE  ((count(CS1_PDM_D_Mini) + count(CS2_PDM_D_Mini) + count(CS3_PDM_D_Mini)))  
    WHEN 0 THEN 1 
ELSE  
((count(CS1_PDM_D_Mini) + count(CS2_PDM_D_Mini) + count(CS3_PDM_D_Mini))) 

END AS My_CS_PDM_D_Mini, 

Ajout d'un CAS pour gérer la division par zéro!

0
user7370387 17 janv. 2017 à 14:17

2 réponses

Meilleure réponse

Si j'ai raison de dire que vous essayez de calculer la fraction de la valeur de chaque ligne sur le total de toutes les lignes, la requête ci-dessous devrait le faire.

SELECT 
  (CS1_PDM_D_Mini + CS2_PDM_D_Mini + CS3_PDM_D_Mini)  / 
    (SUM(CS1_PDM_D_Mini) OVER () + SUM(CS2_PDM_D_Mini) OVER () + SUM(CS3_PDM_D_Mini) OVER ())
  AS My_CS_PDM_D_Mini
FROM mytable

Le bit SUM(CS1_PDM_D_Mini) OVER () utilise une expression Window pour obtenir la somme de toutes les lignes au lieu de simplement regarder la ligne actuelle.

Fonctions de fenêtre décrites à https://www.postgresql.org/docs/ current / static / tutorial-window.html

Cela renverra simplement une liste de fractions, par exemple: 0,5 pour la ligne qui représente 50% du total. Vous voudrez probablement renvoyer la clé de la ligne s'il y en a une. Cela peut être ajouté à la sélection, par exemple:

SELECT 
  meaningful_row_key,
  (CS1_PDM_D_Mini + CS2_PDM_D_Mini + CS3_PDM_D_Mini)  / 
    (SUM(CS1_PDM_D_Mini) OVER () + SUM(CS2_PDM_D_Mini) OVER () + SUM(CS3_PDM_D_Mini) OVER ())
  AS My_CS_PDM_D_Mini
FROM mytable
0
Gary 17 janv. 2017 à 15:35

Veuillez utiliser ceci

SELECT SUM(CS1_PDM_D_Mini) + SUM(CS2_PDM_D_Mini) + SUM(CS3_PDM_D_Mini) / 
       (CS1_PDM_D_Mini + CS2_PDM_D_Mini + CS3_PDM_D_Mini) AS My_CS_PDM_D_Mini
FROM mytable
group by CS1_PDM_D_Mini
    ,CS2_PDM_D_Mini
    ,CS3_PDM_D_Mini
0
Vivek S. 17 janv. 2017 à 11:27