IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Requête SQL sous 8i - Comment faire SVP ?


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 37
    Points : 42
    Points
    42
    Par défaut Requête SQL sous 8i - Comment faire SVP ?
    Bonjour à tous et par avance merci !
    Voilà, j'ai un problème avec une requête dont je n'arrive pas à me dépatouiller. Je compte sur vous !

    Il s'agit pourtant d'une seule table avec deux champs (pour faire simple). Ça a l'air simple effectivement mais je me complique la vie avec trois calculs en projections et plusieurs conditions.

    Illustration ci-après avec la table et le résultat voulu, puis enfin les conditions : (j'espère que ça va le faire graphiquement)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    La table LAMBDA et ses deux champs :
    CONSULTATION ETAT
    ------------ -----
    08/01        N
    08/01        E
    08/01        E
    08/02        I
    08/03        N
    08/03        S
    08/04        E
    08/05        E
    08/05        I
    08/06        E
    08/06        N
    08/06        S
    Illustration du résultat de la requête désirée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CONSULTATION | NOMBRE DE | NOMBRE DE  | NOMBRE DE
                 |     E     |    N       |  S ou I
    ------------  --------    --------     --------
    08/01           2              1
    08/04           1
    08/05           1              1           1
    08/06           1              1           1
    Voici pour les projections, maintenant les conditions :
    Seuls les "E" m'intéressent, quand j'en trouve je les compte. Mais quand j'en trouve, je dois aussi chercher si j'ai des "N" pour les compter aussi, puis chercher si j'ai éventuellement des "I" ou des "S" à additionner encore !
    Eh ben je séche ! Ma difficulté est double, un pas évident d'avoir plusieurs calculs en projection, deux avec ces conditions je n'arrive pas à savoir si je dois le faire en PL/SQL... Mais de toute façon ça ne m'avance pas plus !

    Est-ce que ça vous cause ? En tout cas, j'espère que ça vous tente !
    Encore merci !

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CONSULTATION , SUM(DECODE(Etat,'E',1,0)), SUM(DECODE(Etat,'N',1,0)), SUM(DECODE(Etat,'I',1,'S',1,0))
    FROM table
    HAVING SUM(DECODE(Etat,'E',1,0)) > 0
    GROUP BY consultation

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 37
    Points : 42
    Points
    42
    Par défaut
    Dis moi pas qu'c'est pas vrai ?
    Si court et si rapide ?
    Serais-je donc si nul ?
    Je cours tester ça tout de suite !!!!!!!

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 37
    Points : 42
    Points
    42
    Par défaut
    Super, génial, merci orafrance !!!
    Ça fonctionne parfaitement ! Je n'avais jamais employé ce DECODE auparavant.
    Seulement voilà, c'est contraint et contrit que je me vois obligé de revenir vers vous car je n'arrive pas à l'intégrer à ma requête ...
    J'espère ne pas trop vous bassiner avec mes histoires mais j'ai un gros problème de « savoir faire » apparemment, or je dois y parvenir absolument... bref ! Puis-je abuser ?
    Par avance merci !

    Je reprends :
    Le copier/coller de votre réponse appliqué à mon exemple concret donne ceci et fonctionne à merveille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select lot.conccp as "CONSULTATION", 
    sum(decode(lot.etlid,'E',1,0)) as "NOMBRE DE LOTS E",
    sum(decode(lot.etlid,'N',1,0)) as "NOMBRE DE LOTS N",
    sum(decode(lot.etlid,'S',1,'I',1,0)) as "NOMBRE DE LOTS S OU I"
    from lot
    group by lot.conccp
    having sum(decode(lot.etlid,'E',1,0))>0;
    Voici la requête initiale qui se bornait à compter le nombre de lots pour chaque consultation (avant qu'on me demande de différencier par type de lots).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    select distinct 
    (select gpuid from usr_gpu where consultation.usradm=usrid) as "BUREAU",
    (select substr(usrnom,1,10) from utilisateur 
     where usrid=consultation.usradm) as "REDACTEUR",
    (select substr(usrnom,1,10) from utilisateur 
     where usrid=consultation.usrautcreat) as "AUTEUR",
    consultation.conccp as "N° CONSULTATION",
    (select actclair from activite where actid=programme.actid) as "ACTIVITE",
    consultation.conclair as "OBJET CONSULTATION",
    (select dummy from dual) as "BENEFICIAIRE",
    (select prcclair||' ('||prcdesc||' )' from procedure 
     where prcid=consultation.prcid) as "TYPE PROCEDURE",
    echeancier.echdnotif as "DATE NOTIF",
    consultation.conddepot as "DLRO",
    (select count(lotid) from lot where etlid in ('E') 
     and conccp=consultation.conccp group by lot.conccp) as "NBRE LOTS"
    from consultation,programme,echeancier,or_con
    where programme.prgregrpt=consultation.conccp and
    echeancier.echnum=or_con.echnum and or_con.conccp=consultation.conccp;
    En gros je trouve mes consultations dans la table CONSULTATION et les lots des consultations dans la table LOT. Tout le reste n'est là que pour remplir un tableau d'une douzaine de colonnes. La dernière colonne doit être scindée en trois mais je ne parviens pas à intégrer votre solution. J'ai plein de problèmes de GROUP BY dûs à mes select de select dans les projections et aussi au trop grand nombre de colonnes exigées... Et je ne m'en sors pas !

    C'est vraiment galère pour moi.
    Une nouvelle fois merci...

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            (
             SELECT SUM(DECODE(etlid,'E',1,0)), SUM(DECODE(etlid,'N',1,0)), SUM(DECODE(etlid,'I',1,'S',1,0))
              FROM lot
    		 WHERE conccp = consultation.conccp
            HAVING SUM(DECODE(etlid,'E',1,0)) > 0
            ) AS "NBRE LOTS"
    Sinon, pourquoi tu ne fais pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    SELECT DISTINCT
            usr_gpu.gpuid AS "BUREAU",
            (
                    SELECT  SUBSTR(usrnom,1,10)
                    FROM    utilisateur
                    WHERE   usrid=consultation.usradm
            ) AS "REDACTEUR",
            (
                    SELECT  SUBSTR(usrnom,1,10)
                    FROM    utilisateur
                    WHERE   usrid=consultation.usrautcreat
            )                   AS "AUTEUR"         ,
            consultation.conccp AS "N° CONSULTATION",
            activite.actclair AS "ACTIVITE"          ,
            consultation.conclair AS "OBJET CONSULTATION",
            '' AS "BENEFICIAIRE",
            prcclair ||' (' || prcdesc ||' )' AS "TYPE PROCEDURE",
            echeancier.echdnotif   AS "DATE NOTIF"    ,
            consultation.conddepot AS "DLRO"          ,
            (
             SELECT SUM(DECODE(etlid,'E',1,0)), SUM(DECODE(etlid,'N',1,0)), SUM(DECODE(etlid,'I',1,'S',1,0))
              FROM lot
    		 WHERE conccp = consultation.conccp
            HAVING SUM(DECODE(etlid,'E',1,0)) > 0
            ) AS "NBRE LOTS"
    FROM    consultation,
            programme   ,
            echeancier  ,
            or_con      ,
    		usr_gpu     ,
    		activite    ,
    		procedure   ,
    WHERE   programme.prgregrpt=consultation.conccp
        AND echeancier.echnum  =or_con.echnum
        AND or_con.conccp      =consultation.conccp
    	AND consultation.usradm=usr_gpu.usrid
    	AND activite.actid=programme.actid
    	AND procedure.prcid=consultation.prcid

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 37
    Points : 42
    Points
    42
    Par défaut
    Merci encore pour tous ces efforts mais Oracle me retourne l'erreur ORA-00913 Trop de valeurs pour la fameuse modif si judicieuse... On chauffe, on chauffe !
    Il faut que je gratte. On m'a parlé aussi des jointures externes à la (+)...
    ... jointure externe permet de contrer l'hypothèse du monde clos en considérant qu'en cas d'absence de jointure entre une table et l'autre, on ne supprime par pour autant l'information.
    ... en éliminant les select imbriqués.
    Mais est-ce la solution et est-ce que ça fonctionne bien en 8i ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 37
    Points : 42
    Points
    42
    Par défaut
    ÇA Y EST !
    Mais que ce fut dur !!
    Un GRAND MERCI à orafrance pour son aide précieuse et son abnégation

    D'apparence compliquée de prime abord, l'astucieux DECODE, un FROM (select distinct...), puis un regroupement classique en sont finalement venus à bout ! Pfouh... je reviens de loin...

    Présentation du code final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    select distinct gpuid||'#'||
    substr(u1.usrnom,1,10)||'#'||
    substr(u2.usrnom,1,10)||'#'||
    consultation.conccp||'#'||
    actclair||'#'||
    consultation.conclair||'#'||
    ''||'#'||
    prcclair||' ('||prcdesc||' )'||'#'||
    echdnotif||'#'||
    conddepot||'#'||
    SUM(DECODE(etlid,'E',1,0))||'#'||
    SUM(DECODE(etlid,'N',1,0))||'#'||
    SUM(DECODE(etlid,'S',1,'I',1,0))
    from  	consultation,
    	activite,
    	lot,usr_gpu,
    	utilisateur u1,
    	utilisateur u2,
    	procedure,
    (select distinct o.conccp,e.echnum,echdnotif,actid 
    from or_con o,echeancier e,consultation c,programme p
     where o.echnum=e.echnum and c.conccp=o.conccp and p.prgregrpt=c.conccp) y
    where	consultation.usradm=usr_gpu.usrid and
    	consultation.usradm=u1.usrid and
    	consultation.usrautcreat=u2.usrid and
    	consultation.prcid=procedure.prcid and
    	activite.actid=y.actid and
    	y.conccp=consultation.conccp and
    	lot.conccp= consultation.conccp
    group by 	gpuid,
    		u1.usrnom,
    		u2.usrnom,
    		consultation.conclair,
    		actclair,
    		conddepot,
    		prcclair,
    		prcdesc,
    		consultation.conccp,
    		echdnotif,
    		conddepot
    HAVING SUM(DECODE(lot.etlid,'E',1,0)) > 0
    Pas très disert sur ce forum, je reviendrai c'est promis !

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Félicitations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/04/2011, 11h19
  2. autoexec sous condition?comment faire?
    Par polianita dans le forum Access
    Réponses: 2
    Dernier message: 12/07/2006, 11h57
  3. [Sql server 2005] Comment faire des taches planifiées?
    Par critok dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/05/2006, 12h19
  4. [SQL] requetes inbriquées, comment faire celle ci??
    Par Devil666 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/05/2005, 15h44
  5. affichage requête sql sous phppgadmin
    Par kerzut dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 25/02/2005, 12h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo