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 :

équivalent Having pour les fonction d'agrégation


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 21
    Points
    21
    Par défaut équivalent Having pour les fonction d'agrégation
    Bonjour,

    Cela fait bien longtemps que je n'étais pas passé dans le coin. (tellement que tout mes anciens messages ont disparus )
    Si je viens quémander votre aide c'est que j'ai une petite question.

    Nous voulons créer une requète où en fonction de la valeur d'un paramètre nous ramenons toutes les ligne ou uniquement les dernière en date.

    nous avons réussit à le faire en faisant une sous requète avec dans le select un RANK que l'on sélectionne = 1 si la valeur de notre variable est 1.

    Tout fonctionne sans problème. Le problème c'est que cette vue (car c'est une vue) a déjà 4 niveaux de sous requète. Et là ça fait super long :/
    Dans un soucis de simplification nous souhaiterions donc faire un équivalent au having pour notre fonction.
    Mais de ce que j'ai pu trouver ça ne m'a pas l'air possible.
    Est ce que vous confirmé l'impossibilité ou avez vous une bonne idée à nous sommettre ?

    Merci d'avance.

    Voilà la bête "allégée"
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    SELECT
           P.cd_env                               AS cd_env
          ,P.no_partition                         AS no_partition
          ,P.no_jeu_donnees                       AS no_jeu_donnees
          ,P.dt_arrete                            AS dt_arrete
          ,P.lb_env                               AS lb_env
          ,P.lb_desc                              AS lb_desc
          ,P.cd_pge                               AS cd_pge
          ,IP.lb_pge                              AS lb_pge
          ,P.tp_gel                               AS tp_gel
          ,TG.lb_tp_gel                           AS lb_tp_gel
          ,P.ind_tracker_niv0                     AS ind_tracker_niv0
          ,P.ind_tracker_niv123                   AS ind_tracker_niv123
          ,P.no_lst_flux_mod_init                 AS no_lst_flux_mod_init
          ,P.no_lst_flux_mod_fin                  AS no_lst_flux_mod_fin
          ,PE.no_stock_fem                        AS no_stock_fem
          ,P.cd_traitement                        AS cd_traitement
          ,IT.lb_traitement                       AS lb_traitement
          ,P.no_chainage                          AS no_chainage
          ,P.no_traitement                        AS no_traitement
          ,P.no_batch                             AS no_batch
          ,P.no_lot                               AS no_lot
          ,P.cd_perim_gen                         AS cd_perim_gen
          ,' '                                    AS lb_perim_gen
          ,P.cd_perim_spec                        AS cd_perim_spec
          ,' '                                    AS lb_type_perim_spec
          ,' '                                    AS lb_perim_spec
          ,P.lb_commentaire                       AS lb_commentaire
          ,P.dt_debut_trait                       AS dt_debut_trait
          ,P.dt_fin_trait                         AS dt_fin_trait
          ,LPAD(TRUNC(P.dt_fin_trait - P.dt_debut_trait), 8, 0) 
         ||' '
         ||LPAD(TRUNC(MOD((P.dt_fin_trait - P.dt_debut_trait) * 24, 24)), 2, 0) 
         ||':'
         ||LPAD(TRUNC(MOD((P.dt_fin_trait - P.dt_debut_trait) * 24 * 60, 60)), 2, 0) 
         ||':'
         ||LPAD(TRUNC(MOD((P.dt_fin_trait - P.dt_debut_trait) * 24 * 60 * 60, 60)), 2, 0)
         ||''                                     AS dt_duree
          ,P.cd_statut_trait                      AS cd_statut_trait
          ,ST.lb_statut_trait                     AS lb_statut_trait
          ,P.nb_flux                              AS nb_flux
          ,P.nb_flux_ok                           AS nb_flux_ok
          ,P.nb_flux_ko                           AS nb_flux_ko
          ,P.cd_user                              AS cd_user
          ,NVL2(IU.lb_nom, IU.lb_prenom
                         || ' '
                         || IU.lb_nom, P.cd_user) AS lb_user
          ,P.cd_user_select                       AS cd_user_select
          ,P.ind_histo                            AS ind_histo
          ,DECODE(P.no_lst_flux_mod_init
                 ,P.no_lst_flux_mod_fin
                 -- Si la liste n'a pas changé, l'indicateur est valorisé à 0
                 ,0
                 -- Sinon, l'indicatezur est valorisé à 1
                 ,1)                              AS ind_mod_lst_flux
    FROM
        (
        SELECT PG.cd_env
              ,PG.no_partition
              ,PG.no_jeu_donnees
              ,PG.dt_arrete
              ,PG.lb_env
              ,PG.lb_desc
              ,PG.cd_pge
              ,PG.tp_gel
              ,PG.ind_tracker_niv0
              ,PG.ind_tracker_niv123
              ,PG.no_lst_flux_mod_init
              ,PG.no_lst_flux_mod_fin
              ,PG.cd_traitement
              ,PG.no_chainage
              ,PG.no_traitement
              ,PG.no_batch
              ,PG.no_lot
              ,PG.cd_perim_gen
              ,PG.cd_perim_spec
              ,PG.lb_commentaire
              ,PG.dt_debut_trait
              ,PG.dt_fin_trait
              ,PG.cd_statut_trait
              ,PG.nb_flux
              ,PG.nb_flux_ok
              ,PG.nb_flux_ko
              ,PG.cd_user
              ,PG.ind_histo
              ,RANK() OVER(PARTITION BY SEL.cd_user_select,PG.no_partition
                                       ,PG.cd_traitement
                               ORDER BY PG.dt_debut_trait DESC) AS ind_rang
              ,SEL.cd_user_select
              ,SEL.id_type_trt_select
              ,SEL.ind_dernier_select
        FROM
            PG
                INNER JOIN
                 SEL
                    ON (TRUNC(PG.dt_debut_trait) BETWEEN TRUNC(SEL.dt_debut_select) AND TRUNC(SEL.dt_fin_select))
        WHERE 0 = 0
        -- Si l'indicateur des traitements chaînés est coché dans l'IHM, on limite aux enregistrements ayant un no_chainage
        AND (NVL(PG.no_chainage,NVL(SEL.ind_chaine_select,0)) = 0
            OR PG.no_chainage IS NOT NULL)
        -- Si une PA historisée a été sélectionnée dans l'IHM, on ne prend que les lignes dont le cd_env correspond
        AND SEL.cd_env_select IS NULL
            OR (SEL.cd_env_select IS NOT NULL
                AND PG.ind_histo = 1
                AND PG.cd_env    = SEL.cd_env_select)
        -- Transcodification du code statut du traitement pour correspondre à ceux sélectionnés
        AND SEL.cd_statut_trait_select IS NULL
            OR (DECODE(PG.cd_statut_trait
                   -- Si le statut est "OK", code statut correspondant à "OK" pour l'IHM PAT
                   ,2,'2'
                   -- Si le statut est "KO", code statut correspondant à "KO" pour l'IHM PAT
                   ,3,'3'
                   -- Ai le statut est "En cours", code statut correspondant à "En cours" pour l'IHM PAT
                   ,8,'1'
                   -- Sinon, code statut "Autre" pour l'IHM PAT
                   ,'4') = SEL.cd_statut_trait_select)
        ) P
        INNER JOIN propriete_env PE
            ON (P.no_partition  = PE.no_partition
            AND P.cd_env        = PE.cd_env)
        INNER JOIN ihm_pge IP
            ON NVL(P.cd_pge,0)  = IP.cd_pge
        INNER JOIN type_gel TG
            ON NVL(P.tp_gel,0)  = TG.tp_gel
        INNER JOIN (SELECT DISTINCT
                           cd_traitement
                          ,lb_traitement
                          ,id_type_trt
                    FROM   info_traitement) IT
            ON (P.cd_traitement  = IT.cd_traitement)
        LEFT JOIN ihm_user IU
            ON (P.cd_user = IU.cd_user)
        LEFT JOIN ihm_pat_statut_trait   ST
            ON (P.cd_statut_trait = ST.cd_statut_trait)
    WHERE 0 = 0
    -- Sélection des enregistrements de rang = 1 si la case des derniers traitements est cochée dans l'IHM
    AND DECODE(P.ind_dernier_select, 0, 1, P.ind_rang) = 1
    ;
    Fantome en errance
    Développeur Java
    Développeur Report Builder

  2. #2
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    ça pationne pas les foules mon histoires
    Fantome en errance
    Développeur Java
    Développeur Report Builder

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Ben... pour être honnête, ça prend un petit bout de temps pour rentrer dans ton code, et en plus je ne vois où est le HAVING dont tu parles, donc je ne comprends pas ce que tu veux...
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sckizo Voir le message
    ça pationne pas les foules mon histoires
    Nan, sa paçione pas la foules...

    La close WHERE 0=0, cé pourquoi ?

  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 : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    pour info passionner s'écrit avec 2 s... au moins il sera orthographier correctement une fois

  6. #6
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    @Sckizo

    dans ton exemple il n'y a ni fonction de groupe ni having...
    tu veux quoi exactement ?

    est-ce tu arriverais à nous donner une exemple via des données simples de ce tu voudrais ?
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    ah ouais ! en fait ma question n'est pas clair :/

    et comme un c*n j'ai enlevé la fonction d'aggrégat

    je la remet dans le code.

    Mais en gros l'idée c'est
    est ce qu'un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select rank()
    from ma_table
    having rank () = 1
    où le having est bien sûr un équivalent pour les fonction d'aggrégat.

    PS : merci pour l'orthographe de passion
    Fantome en errance
    Développeur Java
    Développeur Report Builder

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Ce n'est pas nécessaire si j'ai bien compris ...
    Il suffit d'imbriquer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select ...
    from
    (
      select ..., rank() over (...) rn
      from t
    )
    where rn = ...
    Consultant et formateur Oracle

  9. #9
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    oui c'est justement ce que je voudrais éviter.

    les requètes PG et SEL dans mon code ont déjà 3 niveaux d'imbrication. je voudrais en économiser au moins un.
    Fantome en errance
    Développeur Java
    Développeur Report Builder

  10. #10
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Sckizo Voir le message
    oui c'est justement ce que je voudrais éviter.

    les requètes PG et SEL dans mon code ont déjà 3 niveaux d'imbrication. je voudrais en économiser au moins un.
    Et pour quoi ?

  11. #11
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    tu peux peut-être éviter une partie de l'imbrication en factorisant certains Select en préliminaire avec la clause WITH...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  12. #12
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Yorglaa Voir le message
    tu peux peut-être éviter une partie de l'imbrication en factorisant certains Select en préliminaire avec la clause WITH...
    Effectivement on a aussi penser à cela. C'est surement ce que l'on va faire.

    Citation Envoyé par mnitu Voir le message
    Et pour quoi ?
    Aucune contrainte particulière, juste un soucis de lisibilité et une grande curiosité de notre part.
    Fantome en errance
    Développeur Java
    Développeur Report Builder

  13. #13
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     -- Si l'indicateur des traitements chaînés est coché dans l'IHM, on limite aux enregistrements ayant un no_chainage
        AND (		NVL(PG.no_chainage,NVL(SEL.ind_chaine_select,0)) = 0   
        		OR PG.no_chainage IS NOT NULL
            )
    A simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AND (	NVL(SEL.ind_chaine_select,0) = 0   
        		OR PG.no_chainage IS NOT NULL
            )
    Ensuite, la requête étant allégée, je pense qu'il s'agit d'un pb de postage
    Il y a des AND et des OR sans parenthèses
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  14. #14
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par McM Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     -- Si l'indicateur des traitements chaînés est coché dans l'IHM, on limite aux enregistrements ayant un no_chainage
        AND (		NVL(PG.no_chainage,NVL(SEL.ind_chaine_select,0)) = 0   
        		OR PG.no_chainage IS NOT NULL
            )
    A simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AND (	NVL(SEL.ind_chaine_select,0) = 0   
        		OR PG.no_chainage IS NOT NULL
            )
    Ah oui je l'avais pas vue celle-là. C'est pas moi qui l'ai fait

    Citation Envoyé par McM Voir le message
    Ensuite, la requête étant allégée, je pense qu'il s'agit d'un pb de postage
    Il y a des AND et des OR sans parenthèses
    Oui c'est effectivement ça.
    Fantome en errance
    Développeur Java
    Développeur Report Builder

  15. #15
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Sckizo Voir le message
    Ah oui je l'avais pas vue celle-là. C'est pas moi qui l'ai fait
    Excuse non recevable
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  16. #16
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par McM Voir le message
    Excuse non recevable
    Mais euh !
    C'est vrai en plus...

    Bon en même temps j'aurais du le voir c'est moi qui suis chargé de l'optimiser

    Mais quand même !
    Fantome en errance
    Développeur Java
    Développeur Report Builder

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

Discussions similaires

  1. [Débutant] Variables globales pour les fonctions d'un module
    Par guillooom dans le forum Général Python
    Réponses: 6
    Dernier message: 25/03/2011, 15h25
  2. [AC-2003] Quelle référence pour les fonctions de chaînes ?
    Par AndréPe dans le forum VBA Access
    Réponses: 5
    Dernier message: 02/10/2009, 09h41
  3. [XPATH] Mauvais espace de nom pour les fonctions XPath?
    Par avenger1 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 10/03/2008, 14h20
  4. besoin d aide pour les fonction en postgresql
    Par dannw dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 11/07/2007, 21h20
  5. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58

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