[DB2] calcul de pourcentages d'une occurence

calcul de pourcentages d'une occurence [DB2] - SQL/NoSQL - Programmation

Marsh Posté le 06-01-2010 à 15:36:18    

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 ?
Reply

Marsh Posté le 06-01-2010 à 15:36:18   

Reply

Marsh Posté le 06-01-2010 à 16:37:45    

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.
Reply

Marsh Posté le 06-01-2010 à 16:49:12    

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 ?
Reply

Marsh Posté le 06-01-2010 à 16:59:25    

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.
Reply

Marsh Posté le 06-01-2010 à 17:09:08    

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 ?
Reply

Marsh Posté le 07-01-2010 à 11:50:14    

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


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 07-01-2010 à 18:45:04    

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,

Reply

Marsh Posté le 08-01-2010 à 11:18:24    

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 ?
Reply

Marsh Posté le 08-01-2010 à 11:57:03    

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
Reply

Marsh Posté le 08-01-2010 à 11:59:48    

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)

Reply

Marsh Posté le 08-01-2010 à 11:59:48   

Reply

Marsh Posté le 08-01-2010 à 15:12:18    

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

Reply

Marsh Posté le 08-01-2010 à 16:39:03    

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 ?
Reply

Marsh Posté le 08-01-2010 à 16:46:58    

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,

Reply

Sujets relatifs:

Leave a Replay

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