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

Langage SQL Discussion :

Capter la logique pour une requête


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juin 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2017
    Messages : 37
    Points : 23
    Points
    23
    Par défaut Capter la logique pour une requête
    Bonjour,
    j'essaie de comprendre la logique à appliquer pour réussir à obtenir un résultat qui correspond à la réalité.
    Je dispose d'un logiciel auquel je n'ai accès qu'à la base de données et une interface web (pour pimenter le tout ce n'est pas du SQL mais du HQL).
    L'important est la logique que je n'arrive pas à trouver.

    J'ai une requête qui me sort le résultat :

    10/12/2020 Lit1 CP1
    10/12/2020 Lit1


    on code actuel en HQL est :
    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
     
    SELECT 
    sejour.sejo_dat_deb,  lit.lipo_code,  CASE WHEN (sepr_ind_actif = '1' and to_char(sepr.sepr_dat_deb,'YYYY-MM-DD') >=  to_char(mou0.mouv_dat_mou,'YYYY-MM-DD')) THEN prse.prse_code ELSE '' END as prestation
    FROM
    Ide_sejour as sejour
    join sejour.ide_patient as patient
    join sejour.bas_etablissement_by_Sejo_id_etab_con as etab
    join sejour.bas_uf_by_Sejo_id_unfo_heb as ufh 
     
    left join sejour.ide_sejour_prestations as sepr
    join sepr.pad_prestation_sejour prse
    join sejour.bas_catalogue_pers_by_Sejo_id_cape_ven as type
     
    left join sejour.ide_mouvements as mou0
    left join mou0.pad_lit_poste as lit
     
    WHERE 
    etab.etab_id_etab = 19655
     
    AND sejour.sejo_dat_deb <= current_date
    AND(
    NVL(sejour.sejo_dat_fin, '31-12-2999')>=current_date
      OR sejour.sejo_typ_sor IN ('M','P')
    )
    AND sejour.sejo_statut NOT IN ('A','P','Z')
    AND sejour.sejo_dat_sup IS NULL
     
    AND type.cape_code not in ('E' , 'U')
    AND sejour.id = '729863796'
     
    AND sepr_ind_actif = '1'
    Ma question : Quelle serait la démarche permettant d'obtenir une seule ligne quand j'ai une valeur à prestation ?


    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Bonjour,


    Citation Envoyé par Noob_si Voir le message
    Ma question : Quelle serait la démarche permettant d'obtenir une seule ligne quand j'ai une valeur à prestation ?
    Je ne connais pas HQL, mais je constate qu'aucune des jointures n'a de critère de jointure explicite (ON absent).
    Du coup, soit HQL interprète ces jointures comme des NATURAL JOIN , ce qu'il faut absolument éviter, soit la requête doit planter sur erreur de syntaxe.

    Par ailleurs, je vois qu'il y a alternance de jointures INNER et OUTER dont la syntaxe, en tout cas en SQL, produit des jointures INNER uniquement
    cf. mon blog sur ce sujet ici : https://www.developpez.net/forums/bl...-escartefigue/

  3. #3
    Membre à l'essai
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juin 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2017
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Bonjour escartefigue,

    Citation Envoyé par escartefigue Voir le message
    Bonjour,
    Je ne connais pas HQL, mais je constate qu'aucune des jointures n'a de critère de jointure explicite (ON absent).
    Du coup, soit HQL interprète ces jointures comme des NATURAL JOIN , ce qu'il faut absolument éviter, soit la requête doit planter sur erreur de syntaxe.
    En fait je n'ai pas le choix, c'est le manuel de mon éditeur qui me l'impose, en fait ce qui m'a été expliqué a priori les jointures sont retraitées par leur tambouille et font les jointures adaptées en fonction de leur construction.


    J'ai suivi ton conseil sur les INNER et les OUTER j'ai tout mis en INNER.

    La question reste entière sur une astuce permettant de "masquer" cette ligne.

    Merci beaucoup.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Noob_si Voir le message
    J'ai suivi ton conseil sur les INNER et les OUTER j'ai tout mis en INNER.
    Ce n'est absolument pas ce que j'ai dit !
    Le choix d'une jointure INNER ou OUTER dépend du fait que les données d'une table sont obligatoires ou facultatives, rien d'autre.
    Un fois ce choix fait, il faut savoir comment coder les jointures quand on a besoin de combiner dans une même requêtes INNER et OUTER JOIN, c'est dans ce cas que la préconisation expliquée dans mon blog s'applique.

    Votre requête comporte un grand nombre de tables, il est donc tout à fait normal d'avoir plusieurs résultats.
    Pour avoir une seule ligne, il faut une règle de gestion expliquant laquelle des différentes lignes doit être retenue.
    Donc, quelle est cette règle de gestion ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juin 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2017
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Effectivement le résultat obtenu est "normal"
    Puisque je veux inclure les séjours qui ont une valeur nulle pour la prestation.
    Or j'ai plusieurs prestations possibles, certaines sont à null d'autres sont à 1.

    J'ai donc pensé à utiliser une fonction d'agrégation du type LISTAGG(<champ>, ';') sauf qua ça se complique avec l'utilisation d'un "CASE WHEN" qui utilise en plus deux conditions.

    Une version simplifiée d'une piste est visible sur la communauté oracle https://community.oracle.com/tech/de...k-with-listagg

    Sauf que j'obtiens une jolie erreur "unexpected token: within"

    lorsque j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CASE  WHEN (sepr_ind_actif = '1' and to_char(sepr.sepr_dat_deb,'YYYY-MM-DD') >=  to_char(mou0.mouv_dat_mou,'YYYY-MM-DD')) THEN  prse.prse_code ELSE '' END , ';')within group ( order by sepr.sepr_dat_deb )
    AS prestation
    Mais a priori ça sort de ce fil... puisque c'est du Oracle

    Bonne journée et merci.

Discussions similaires

  1. [2008R2] Logique pour une requête de type Slope
    Par lepotier dans le forum Développement
    Réponses: 0
    Dernier message: 24/11/2014, 12h00
  2. J'ai besoin de votre aide pour une requête
    Par ovdz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/05/2005, 11h42
  3. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 02h40
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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