Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/08/2011, 09h39   #1
Invité de passage
 
Femme
Étudiant
Inscription : avril 2011
Messages : 32
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 32
Points : 0
Points : 0
Par défaut Ré-écrire une requete sql pour qu'elle fonctionne sous oracle

Bonjour,
J'ai une requete ecrite en sql pour la base de donnée Mysql , je veux la changer pour fonctionner sous Oracle mais je ne sais pas comment faire ça!

C'est la requete:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT TRUNCATE(sum(CASE WHEN changeitem.newstring='Closed' AND changeitem.groupid=changegroup.id AND changegroup.issueid=jiraissue.id THEN 1 ELSE 0 END)/ 
(SELECT count(jiraissue.id)  
FROM jiraissue JOIN project ON( jiraissue.project=project.id) 
JOIN priority ON(jiraissue.priority=priority.id ) AND project.pname IN ('project1')),2) AS avgBackAndForth,  priority.pname AS champ1,project.pname AS champ2
FROM changeitem
JOIN changegroup ON (changeitem.groupid=changegroup.id)
JOIN jiraissue ON (jiraissue.id=changegroup.issueid)
JOIN project ON( jiraissue.project=project.id) 
JOIN priority ON(jiraissue.priority=priority.id )
AND project.pname  IN ('project1')
AND  jiraissue.CREATED BETWEEN '2011-05-18 00:00:00.0' AND '2011-06-04 00:00:00.0' 
GROUP BY champ1,champ2 ;
ramoucha23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 12h50   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Il n'y a pas grand chose à changer à priori :
truncate -> trunc
les dates -> to_date
pas d'alias dans le group by
et une remarque, la syntaxe ANSI pour les jointures n'implique pas de ne pas utiliser la clause where...

Et puis une requête ça s'indente un peu pour pouvoir la relire plus facilement :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT TRUNC(sum(CASE WHEN changeitem.newstring = 'Closed' 
                       AND changeitem.groupid   = changegroup.id 
                       AND changegroup.issueid  = jiraissue.id 
                      THEN 1 ELSE 0 
                  END )
             / (SELECT count(jiraissue.id)
                  FROM jiraissue 
                  JOIN project  ON jiraissue.project  = project.id
                  JOIN priority ON jiraissue.priority = priority.id 
                 WHERE project.pname IN ('project1')
                ),2)    AS avgBackAndForth
       , priority.pname AS champ1
       , project.pname  AS champ2
  FROM changeitem
  JOIN changegroup ON changeitem.groupid = changegroup.id
  JOIN jiraissue   ON jiraissue.id       = changegroup.issueid
  JOIN project     ON jiraissue.project  = project.id
  JOIN priority    ON jiraissue.priority = priority.id
 WHERE project.pname  IN ('project1')
   AND jiraissue.CREATED BETWEEN to_date('2011-05-18 00:00:00','YYYY-MM-DD HH24:MI:SS') 
                             AND to_date('2011-06-04 00:00:00','YYYY-MM-DD HH24:MI:SS')
 GROUP BY priority.pname, project.pname
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 13h25   #3
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
la CASE est remplacé par des DECODE
les AS pour les alias sont facultatifs

Citation:
AND '2011-06-04 00:00:00.0'
le .0 de type chrono n'existe pas en Oracle


voici la syntaxe

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT TRUNC(
                sum(
                    decode(
                           changeitem.newstring,'Closed',decode(
                                                                changeitem.groupid,changegroup.id,decode(
                                                                                                        changegroup.issueid,jiraissue.id,1,0
                                                                                                        ),0
                                                               ),0
                           )
 
                    )/(SELECT count(jiraissue.id)  
                       FROM jiraissue JOIN project ON( jiraissue.project=project.id)JOIN priority ON(jiraissue.priority=priority.id ) AND project.pname IN ('project1')),2
                ) AS avgBackAndForth,  
   priority.pname AS champ1,
    project.pname AS champ2
 
FROM changeitem
JOIN changegroup ON (changeitem.groupid=changegroup.id)
JOIN jiraissue ON (jiraissue.id=changegroup.issueid)
JOIN project ON( jiraissue.project=project.id) 
JOIN priority ON(jiraissue.priority=priority.id )
AND project.pname  IN ('project1')
AND  jiraissue.CREATED BETWEEN to_date('2011-05-18 00:00:00','yyyy-mm-dd HH24:MI:SS') AND to_date('2011-06-04 00:00:00','yyyy-mm-dd HH24:MI:SS') 
GROUP BY priority.pname,project.pname ;
Bon test
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 13h34   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
CASE existe sur oracle et est à la fois plus puissant et lisible que DECODE notamment dans cette requête.

[edit] Il y a une autre différence avec mysql c'est la division par 0 :
Code :
1
2
3
4
5
SQL> SELECT 1/0 FROM dual;
SELECT 1/0 FROM dual
        *
ERROR at line 1:
ORA-01476: divisor IS equal TO zero
alors que sur mysql ça dépend du mode utilisé : sqlmode_error_for_division_by_zero
Mais bon je suppose que tu ne t'attends pas à ce que le count renvoie 0.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h35.


 
 
 
 
Partenaires

Hébergement Web