Calculer un pourcentage dans une requete

Calculer un pourcentage dans une requete - SQL/NoSQL - Programmation

Marsh Posté le 15-12-2010 à 15:43:15    

Bonjour,
 
Je me permets de poster un message sur le forum car j'ai un petit souci dans ma requête SQL. Je voudrais afficher le pourcentage de réponse oui dans mon SELECT et j'y arrive pas.
 
Pour le moment ma requete m'affiche les résultats suivants :
 
Compte ICD | Reponse | Code
2               | NON      | C76.4
5               | OUI       | C76.4
3               | OUI       | C26.9
 
ce que je voudrais c'est afficher une colonne supplémentaire qui serait de la façon suivante :
 
Compte ICD | Reponse | Code | Pourcentage oui
2               | NON      | C76.4 |
5               | OUI       | C76.4 | 71.42
3               | OUI       | C26.9 | 100
 
Ma table se structure de la façon suivante :
 
RESOURCE :
 
ID_RES | ICD | CONSENT | SAMPLE_DATE
 
Ma requête est la suivante :
 

Code :
  1. SELECT
  2.   count(RES.ICD) AS "Compte CODE en 2010",
  3.   RES.CONSENT AS "reponse",
  4.   RES.ICD AS "CODE"
  5. FROM
  6.   RESOURCE RES
  7. WHERE
  8.   trunc(RES."SAMPLE_DATE", 'DD') > TO_DATE('10/12/2010', 'DD-MM-YYYY')
  9.   AND RES.ICD IS NOT NULL
  10.   GROUP BY (RES.ICD, RES.CONSENT)
  11. ORDER BY
  12.   RES.ICD


 
Est ce que quelqu'un aurait une idée de comment faire pour afficher cette colonne pourcentage ?
 
Merci d'avance.

Reply

Marsh Posté le 15-12-2010 à 15:43:15   

Reply

Marsh Posté le 15-12-2010 à 15:57:10    

Quelle base de données ? Access ? MySQL ? SQL Server ? Oracle ? Sybase ?
 
Si je comprends bien, le pourcentage est le nombre de OUI divisé par le nombre total de réponses.
On peut facilement obtenir ce nombre total après avoir déjà fait la requête des réponses.
Mais faire les deux choses en même temps est beaucoup plus compliqué. Cela, nécessite au moins de faire une sous-requête, mais je ne sais pas si c'est possible avec votre moteur de base de données.
Pourquoi ne pas séparer la requête des réponses et le calcul du pourcentage ?

Reply

Marsh Posté le 15-12-2010 à 16:22:17    

Bonjour Olivthill,
 
Merci pour ta réponse. Oui c'est bien ça le pourcentage est le nombre de OUI divisé par le nombre total de réponses pour chaque code.  
 
Effectivement, j'avais pensé à faire un sous requête mais sans succès. Je pense que c'est possible sous Oracle mais j'y suis pas arrivé.
 
Pourrais tu me développer un peu plus ton idée de séparer la requête des réponses et le calcul du pourcentage ?
 
Encore merci pour ton aide.

Reply

Marsh Posté le 20-12-2010 à 17:14:25    

Il faut faire une première requête qui ramènera le total (tu mets le code, et une somme sur le total des réponses elle sera utilisée comme "une table" source
 

Code :
  1. SELECT
  2.   count(RES.ICD) AS "Total Compte CODE en 2010",
  3.   RES.ICD AS "CODE"
  4. FROM
  5.   RESOURCE RES
  6. WHERE
  7.   trunc(RES."SAMPLE_DATE", 'DD') > TO_DATE('10/12/2010', 'DD-MM-YYYY')
  8.   AND RES.ICD IS NOT NULL
  9.   GROUP BY (RES.ICD)


 
Ensuite ta requete existante dans laquelle tu rajoutes le champs calculés en faisant ta jointure sur le code.
 
Essaye la requete ci-dessous
 

Code :
  1. SELECT
  2.   count(RES.ICD) AS "Compte CODE en 2010",
  3.   RES.CONSENT AS "reponse",
  4.   RES.ICD AS "CODE",
  5.   count(RES.ICD) / TOT.SOMME AS POURCENTAGE
  6. FROM
  7. RESOURCE RES
  8. INNER JOIN
  9. (
  10.      SELECT count(RES.ICD) AS "SOMME"
  11.                , RES.ICD AS "CODE"
  12.      FROM RESOURCE RES
  13.      WHERE  trunc(RES."SAMPLE_DATE", 'DD') > TO_DATE('10/12/2010', 'DD-MM-YYYY')
  14.                 AND RES.ICD IS NOT NULL
  15.      GROUP BY (RES.ICD)
  16. ) AS TOT
  17. ON (RES.CODE = TOT.CODE)
  18. WHERE
  19.   trunc(RES."SAMPLE_DATE", 'DD') > TO_DATE('10/12/2010', 'DD-MM-YYYY')
  20.   AND RES.ICD IS NOT NULL
  21.   GROUP BY (RES.ICD, RES.CONSENT)
  22. ORDER BY
  23.   RES.ICD


Message édité par dlaumor le 20-12-2010 à 17:15:26
Reply

Marsh Posté le 21-12-2010 à 09:20:23    

Bonjour dlaumor,
 
Merci beaucoup pour ton aide. Je ne savais pas que l'on pouvais imbriquer une requête select dans un inner join. Super ! Merci encore.

Reply

Marsh Posté le 21-12-2010 à 11:18:49    

Une autre solution aurait été de créer une vue avec la première requête et de faire ta jointure sur la vue, ça revenait au même ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed