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

PL/SQL Oracle Discussion :

Identificateur non valide ORA-00904 [11g]


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Clavardeur en tout genre
    Inscrit en
    août 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Clavardeur en tout genre

    Informations forums :
    Inscription : août 2019
    Messages : 60
    Points : 59
    Points
    59
    Par défaut Identificateur non valide ORA-00904
    Bien le bonjour à tous,

    Je tente de faire la somme de deux requêtes.

    Le but étant de faire la somme des interventions en fonction de la date d'appel da_ap et celui qui les a crée wo_user_creator sur deux tables différentes, En_cours et Archive, afin d'avoir le total des interventions créées par les deux techniciens en par rapport au numéro de semaine.

    Je crois comprendre le message d'erreur, "Da_ ap" n'est pas retrouvé dans le SELECT permettant de faire la somme mais malgré plusieurs tentatives et essais je ne vois pas comment résoudre la problématique.
    Pourriez vous éclairer ma lanterne ?

    D'avance merci.

    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
    SELECT
       sum(inter) 
    FROM
       (
          SELECT
             TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IW'),
             TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY'),
             COUNT(nu_int) AS inter 
          FROM
             en_cours 
          WHERE
             (
                wo_user_creator = 'TECH1' 
                OR wo_user_creator = 'TECH2'
             )
             AND TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY') = '2023' 
          UNION ALL
          SELECT
             TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IW'),
             TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY'),
             COUNT(nu_int) AS inter 
          FROM
             Archive 
          WHERE
             (
                wo_user_creator = 'TECH1' 
                OR wo_user_creator = 'TECH2'
             )
             AND TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY') = '2023' 
       )
    GROUP BY
       TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IW')

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    9 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 9 703
    Points : 37 153
    Points
    37 153
    Billets dans le blog
    4
    Par défaut
    la requête principale ne demande que la somme, ce faisant, le GROUP BY n'a rien à faire ici, ou alors il faut ajouter la colonne du GROUP BY dans le SELECT.

  3. #3
    Membre du Club
    Homme Profil pro
    Clavardeur en tout genre
    Inscrit en
    août 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Clavardeur en tout genre

    Informations forums :
    Inscription : août 2019
    Messages : 60
    Points : 59
    Points
    59
    Par défaut
    Merci pour ta réponse.

    Lorsque je rajoute la colonne duGROUP BY dans le SELECT j'ai le même message d'erreur.
    Lorsque je rajoute Da_ap dans le SELECT idem. J'avoue ne pas comprendre.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    9 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 9 703
    Points : 37 153
    Points
    37 153
    Billets dans le blog
    4
    Par défaut
    il faut donner un alias à la requête corrélée et aux colonnes restituées

    Exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with T1 (c1, c2) as
        (select 1, 'toto' from dual union all
         select 2, 'truc' from dual union all
         select 3, 'toto' from dual union all
         select 4, 'xxxx' from dual
        )
    select YY
         , sum(XX)
    from (select c2 as YY
               , c1 as XX
         from T1)  subq
    group by YY

    subq est l'alias de la table corellée, XX et YY sont les alias des colonnes restituées

  5. #5
    Membre du Club
    Homme Profil pro
    Clavardeur en tout genre
    Inscrit en
    août 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Clavardeur en tout genre

    Informations forums :
    Inscription : août 2019
    Messages : 60
    Points : 59
    Points
    59
    Par défaut
    ok merci pour la piste de travail, il me reste qu' à appréhender tout cela.

    Merci pour ton temps

  6. #6
    Membre du Club
    Homme Profil pro
    Clavardeur en tout genre
    Inscrit en
    août 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Clavardeur en tout genre

    Informations forums :
    Inscription : août 2019
    Messages : 60
    Points : 59
    Points
    59
    Par défaut
    Merci encore Escartefique j'ai essayé d'utiliser ta réponse mais je ne vois pas comment cela me dépasse visiblement.
    Ceci dit cela m' amené à une autre approche qui est fonctionnelle, je suis pas loin de ton exemple.

    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
    WITH RequeteTotale AS (
        SELECT  
            TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IW') AS Semaine,
            TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY') AS annee,
            COUNT(nu_int) AS inter
        FROM en_cours 
        WHERE 
            (wo_user_creator ='tech1' OR wo_user_creator ='tech2')
            AND TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY') = '2023'
        GROUP BY
            TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IW'),
            TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY')
        UNION
        SELECT  
            TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IW') AS Semaine,
            TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY') AS annee,
            COUNT(nu_int) AS inter
        FROM archive
        WHERE 
            (wo_user_creator ='tech1' OR wo_user_creator ='tech2')
            AND TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY') = '2023'
        GROUP BY
            TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IW'),
            TO_CHAR(TO_DATE(da_ap, 'YYYY-MM-DD'), 'IYYY')
    )
    SELECT
        Semaine,
        annee,
        SUM(inter) AS TotalInter
    FROM RequeteTotale
    GROUP BY
        Semaine,
        annee
    ORDER BY
        Semaine DESC;

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    septembre 2008
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2008
    Messages : 8 412
    Points : 17 646
    Points
    17 646
    Par défaut
    Ce que voulait dire escartefigue, c'est que le nom de colonne DA_AP est perdu dans votre première sous-requête.
    De ce fait, group by extérieur vous renvoyait le message d'erreur.

    Avec votre nouvelle requête, c'est très bien !

    Si je peux me permettre une évolution que vous n'avez pas demandée, je procéderais aux modifications suivantes :
    1. Séparation des données de TECH1 & TECH2
    2. Mise en place d'une table calendrier
    3. Y rajouter cette colonne cal_annee_iso as (to_char(cal_jour, 'iyyy')) not null
    4. Jointure externe pour récupérer les semaines sans intervention


    Ça donnera une requête de ce genre :
    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
    with cte_encours_archive_dt as
    (
      select to_date(da_ap, 'yyyy-mm-dd')                        as da_ap_dt
           , count(case wo_user_creator when 'tech1' then 1 end) as inter_tech1
           , count(case wo_user_creator when 'tech2' then 1 end) as inter_tech2
        from en_cours
       where wo_user_creator in ('tech1', 'tech2')
         and to_char(to_date(da_ap, 'yyyy-mm-dd'), 'iyyy') = '2023'
    group by to_date(da_ap, 'yyyy-mm-dd')
       union all
      select to_date(da_ap, 'yyyy-mm-dd')
           , count(case wo_user_creator when 'tech1' then 1 end)
           , count(case wo_user_creator when 'tech2' then 1 end)
        from archive
       where wo_user_creator in ('tech1', 'tech2')
         and to_char(to_date(da_ap, 'yyyy-mm-dd'), 'iyyy') = '2023'
    group by to_date(da_ap, 'yyyy-mm-dd')
    )
        select cal.cal_semaine_iso
             , coalesce(sum(cea.inter_tech1), 0) as inter_tech1
             , coalesce(sum(cea.inter_tech2), 0) as inter_tech2
             , coalesce(sum(cea.inter_tech1), 0)
             + coalesce(sum(cea.inter_tech2), 0) as total_inter
          from v_calendrier           cal
     left join cte_encours_archive_dt cea on cea.da_ap_dt = cal.cal_jour
         where cal.cal_annee_iso = '2023'
      group by cal.cal_semaine_iso
      order by cal.cal_semaine_iso;

  8. #8
    Membre du Club
    Homme Profil pro
    Clavardeur en tout genre
    Inscrit en
    août 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Clavardeur en tout genre

    Informations forums :
    Inscription : août 2019
    Messages : 60
    Points : 59
    Points
    59
    Par défaut
    Excellent merci pour cette évolution, avec la reprise des éléments de ma requête c'est très clair !Cela me donne des perspectives intéressantes

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

Discussions similaires

  1. erreur ora-00904 identificateur non valide
    Par zed80 dans le forum Oracle
    Réponses: 2
    Dernier message: 05/01/2010, 13h23
  2. Ora-00904 Identificateur non valide ?
    Par DBA_OCP dans le forum Oracle
    Réponses: 1
    Dernier message: 05/06/2009, 16h03
  3. ORA-00904 : identificateur non valide
    Par hotcold dans le forum SQL
    Réponses: 10
    Dernier message: 01/03/2009, 19h20
  4. Réponses: 2
    Dernier message: 26/02/2008, 09h16
  5. Réponses: 5
    Dernier message: 13/08/2007, 13h02

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