Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1738 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [DB2] calcul de pourcentages d'une occurence

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[DB2] calcul de pourcentages d'une occurence

n°1955530
Terenas
Posté le 06-01-2010 à 15:36:18  profilanswer
 

Saluts à tous,
 
Bon voilà je galère un peu sous DB2 avec une requête qui fonctionne bien sous Oracle.
 
Je cherche à calculer le pourcentage de caque type de "code_reponse" pour les enregistrements donc le type_trace est "L" et le num_etape "2".
 
 
Voila un extrait de la structure de maTable
 

Code :
  1. code_reponse    code_trait     type_id        type_trace     num_etape
  2. ------------    ----------     -----------    -----------    -----------
  3. 00              21             2009-12-28     L              2
  4. 01              23             2009-12-28     R              4
  5. 61              25             2009-12-26     L              2
  6. 51              21             2009-12-26     R              2
  7. 98              21             2009-12-23     L              2
  8. 55              23             2009-12-22     L              3
  9. 50              21             2009-12-26     R              3
  10. 91              21             2009-12-23     L              2
  11. 61              23             2009-12-22     L              2
  12. 00              21             2009-12-26     R              6
  13. 00              21             2009-12-23     L              2
  14. 00              23             2009-12-22     L              2


 
 
Voici la requête qui fonctionne sous une base oracle, mais sous DB2 elle ne veut pas s'executer.

Code :
  1. SELECT CODE_REPONSE,                                                         
  2.   (COUNT(CODE_REPONSE))/(SELECT COUNT(CODE_REPONSE)
  3.     FROM maTable
  4.     WHERE TYPE_TRACE= 'L' AND NUM_ETAPE=2)   * 100.00                             
  5. FROM maTable                                                         
  6. WHERE TYPE_TRACE= 'L' AND NUM_ETAPE=2                                         
  7. GROUP BY CODE_REPONSE


 
 
Merci à vous pour votre aide


---------------
_.·´¯)Mon feedback(¯`·._ || What shall we die for ?
mood
Publicité
Posté le 06-01-2010 à 15:36:18  profilanswer
 

n°1955565
anapajari
s/travail/glanding on hfr/gs;
Posté le 06-01-2010 à 16:37:45  profilanswer
 

là ta requête elle doit toujours te retourner 1 (vu que c'est la même sous-requete) donc je suis sceptique du resultat produit sur oracle :o

 

Maintenant moi j'écrirai plutot la requete comme ça (et ça doit marcher sous db2):

Code :
  1. SELECT sum(case when type_trace='L' AND num_etape=2  then 1 else 0 end)/count(*) FROM matable
 


Message édité par anapajari le 06-01-2010 à 16:38:24

---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1955573
Terenas
Posté le 06-01-2010 à 16:49:12  profilanswer
 

Avant tout merci pour la réponse.
Le problème est qu'elle me retourne 0.
 
En fait je souhaite une réponse du type :
 

Code :
  1. code_reponse   pourcentage
  2. ------------   -----------
  3. 00                35,20
  4. 01                25,15
  5. .....
  6. 51                00,21
  7. ...
  8. 99                01,84
  9. ...


 
Voici le retour de la requete sous oracle :

Code :
  1. COD_REP POURCENTAGE           
  2. ------- ----------------------
  3. 00      89,88894030541416011105969458583988894031
  4. 04      0,0347061545580749652938454419250347061546
  5. 05      0,7172605275335492827394724664507172605275
  6. 12      0,7403979639055992596020360944007403979639
  7. 14      0,0231374363720499768625636279500231374364
  8. 38      0,0578435909301249421564090698750578435909
  9. 51      3,4359093012494215640906987505784359093
  10. 54      0,0115687181860249884312818139750115687182
  11. 55      0,8560851457658491439148542341508560851458
  12. 56      0,0115687181860249884312818139750115687182
  13. 57      0,3239241092086996760758907913003239241092
  14. 59      0,0231374363720499768625636279500231374364
  15. 61      3,40120314669134659879685330865340120315
  16. 68      0,1156871818602498843128181397501156871819
  17. 75      0,0231374363720499768625636279500231374364
  18. 99      0,3354928273947246645071726052753354928274


---------------
_.·´¯)Mon feedback(¯`·._ || What shall we die for ?
n°1955582
anapajari
s/travail/glanding on hfr/gs;
Posté le 06-01-2010 à 16:59:25  profilanswer
 

Je dirais qu'en fait tu as un problème d'integer VS decimal si ta requête te remonte partout 0.
le *100.00 intervient trop tard car l'opération de division a été effectué uniquement avec des integers et le resultat en est alors également un (donc 0).
Essaye juste en déplacement le *100.00 comme ça

Code :
  1. ...
  2. (COUNT(CODE_REPONSE)*100.00)/(SELECT COUNT(CODE_REPONSE)      FROM maTable)
  3. ...


edit:
sinon cast les counts en decimaux


Message édité par anapajari le 06-01-2010 à 17:00:33

---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1955590
Terenas
Posté le 06-01-2010 à 17:09:08  profilanswer
 

en fait je n'ai même pas de 0 en tant que réponse. Il refuse d'exécuter la requête sans me sortir de code d'erreur.
 
J'avais tenté en déplaçant le *100.00 mais sans meilleur succès


---------------
_.·´¯)Mon feedback(¯`·._ || What shall we die for ?
n°1955756
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-01-2010 à 11:50:14  profilanswer
 

sans plus d'infos c'est difficile de t'aider ...


---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1955930
Tibar
Posté le 07-01-2010 à 18:45:04  profilanswer
 

Salut,
 
J'ai fait ça vite fait sous Oracle :  
 
SELECT DISTINCT MT.Code, DRV.NB_OCC / (SELECT COUNT(*) FROM MATABLE MTA WHERE MTA.TYPE = 'L' AND MTA.Etape = 2)  
FROM MATABLE MT
INNER JOIN
  (
  SELECT MT.code AS CODE, COUNT(*) AS NB_OCC
  FROM MATABLE MT
  WHERE MT.TYPE = 'L' AND MT.Etape = 2
  GROUP BY MT.CODE
  )
DRV ON DRV.code = MT.Code
WHERE MT.TYPE = 'L' AND MT.Etape = 2
 
Bon courage,

n°1956068
Terenas
Posté le 08-01-2010 à 11:18:24  profilanswer
 

Tibar a écrit :

Salut,
 
J'ai fait ça vite fait sous Oracle :  
 
SELECT DISTINCT MT.Code, DRV.NB_OCC / (SELECT COUNT(*) FROM MATABLE MTA WHERE MTA.TYPE = 'L' AND MTA.Etape = 2)  
FROM MATABLE MT
INNER JOIN
  (
  SELECT MT.code AS CODE, COUNT(*) AS NB_OCC
  FROM MATABLE MT
  WHERE MT.TYPE = 'L' AND MT.Etape = 2
  GROUP BY MT.CODE
  )
DRV ON DRV.code = MT.Code
WHERE MT.TYPE = 'L' AND MT.Etape = 2
 
Bon courage,


 
 
Salut à toi et merci pour le coup de main.
 
Voici la réponse sous DB2 :
 
Sorry, a system error occurred. Your command may not have been executed.
                                                                         
Explanation:                                                            
  DSQ10497 Non end-user SQLCODE returned from DBM.  SQLCA is as follows:
  SQLCODE=-4700/ SQLERRM=/ SQLERRP=DSNXOCNR/ SQLERRD(HEX)=FFFFFF9C      
  00000000 00000000 FFFFFFFF 00000000 00000000/ SQLWARN=           /    
  SQLSTATE=56038/  *** CMD=RUN                                          

 
Comme DB2 n'est pas ma spécialité je ne sais pas trop à quoi ceci correspond.


---------------
_.·´¯)Mon feedback(¯`·._ || What shall we die for ?
n°1956105
MagicBuzz
Posté le 08-01-2010 à 11:57:03  profilanswer
 

Ton problème semble venir du fait que DB2 n'arrive pas à faire une sous-requête.

 

Alors deux solutions possible :
- BD2 c'est d'la merde, en retard de 20 ans sur le plus pourri des autres SGBD (ça c'est très fortement possible)
- DB2 à une syntaxe particulière pour faire des subquery (plus probable)


Message édité par MagicBuzz le 08-01-2010 à 11:57:09
n°1956107
MagicBuzz
Posté le 08-01-2010 à 11:59:48  profilanswer
 

A priori, c'est un mix des deux : sous-requête uniquement dans le FROM et obligatoirement alisées (suppositions par rapport à ce que j'ai pu trouver)

mood
Publicité
Posté le 08-01-2010 à 11:59:48  profilanswer
 

n°1956187
Tibar
Posté le 08-01-2010 à 15:12:18  profilanswer
 

Bon, après quelques galères, je peux te proposer ça : (je n'ai pas renommé mes tables, ça te donnera mes initiales, mais j'ai trop peur des alias ;-) :  
 
    SELECT DISTINCT XB.Code, DRV.NB_OCC / DRVX.Tot
    FROM xba_test XB
    INNER JOIN
      (
      SELECT XB.code AS CODE, COUNT(*) AS NB_OCC
      FROM xba_test XB
      WHERE XB.TYPE = 'L' AND XB.Etape = 2
      GROUP BY XB.CODE
      )
    DRV ON DRV.code = XB.Code
     
     
    INNER JOIN  
    (
      SELECT DISTINCT XB.Code, DRV.tot
      FROM xba_test XB
      INNER JOIN  
      (
      SELECT COUNT(*) AS TOT
      FROM xba_test XB
      WHERE XB.TYPE = 'L' AND XB.Etape = 2
      ) drv ON 1 = 1
    ) DRVX ON DRVX.Code = XB.Code
     
    WHERE XB.TYPE = 'L' AND XB.Etape = 2
 
si la jointure ON 1 = 1 ne passe, il y a peut être une autre syntaxe, mais chez moi ça passe (sous Oracle)...
 
Bon courage

n°1956218
Terenas
Posté le 08-01-2010 à 16:39:03  profilanswer
 

Je vais tenter lundi, j'ai plus la main sur la base pour le moment.
 
Effectivement sous Oracle tout fonction mais DB2, c'est vraiment très particulier ...


---------------
_.·´¯)Mon feedback(¯`·._ || What shall we die for ?
n°1956220
Tibar
Posté le 08-01-2010 à 16:46:58  profilanswer
 

Ok, sinon en 2 fois, la problématique étant de sortir le total autant de fois qu'il y a de lignes répondant au critère...
Une requête qui initialise une variable avec le nombre de lignes qui répondent au critère, et une requête qui sort le nombre d'occurrence de chaque Code (déjà faite)...
 
Bon courage,


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [DB2] calcul de pourcentages d'une occurence

 

Sujets relatifs
sélection d'une occurence par un paramètre[DB2] extraction de database reste vide sur DB V7
Calcul auto montant d'un séjour selon dates choisiesCalcul d'une moyenne
Calculs et notes de calcul[HTML/CSS/Javascript] Calcul coté client avec visualisation
Faire un calcul sans rafraichir une page php[OpenOffice] Calcul de prix
Création d'un générateur d'exercices de calcul mental aléatoireSQL-Firebird-Calcul heurespour planning
Plus de sujets relatifs à : [DB2] calcul de pourcentages d'une occurence


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR