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

Requêtes MySQL Discussion :

fusionner des tuples


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    profiler
    Inscrit en
    Février 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : profiler

    Informations forums :
    Inscription : Février 2008
    Messages : 84
    Points : 99
    Points
    99
    Par défaut fusionner des tuples
    Bonsoir

    Pour du décisionnel dans de l’hôtellerie, j'ai une vue au format suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE `v_statut_passager` (
    	`Id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
    	`Passager` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
    	`TypeLogement` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
    	`Residence` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
    	`Source` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
    	`Statut` TINYINT(3) UNSIGNED NULL DEFAULT NULL
    	[.....]
    ) ENGINE=MyISAM;
    Celle ci affiche le statut (Statut: réservation, occupation, abandon...) d'une personne (Passager) dans un logement (TypeLogement: T1, T2, T3...) dans une résidence (Residence). L'information peut provenir de 2 applications métier différentes (Source: 'AGLAE' ou 'Heberg'). Bien évidement, chaque source peut fournir un statut différent. Le but est de retourner dans une requête un enregistrement par ligne qui résume les 2 statuts possibles.

    Donc lorsque je fais une requête du 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
    select passager.ine, passager.nom, passager.prenom, logement.libelle, 
    case vue.source when "1" then statut.Libelle end as aglae, 
    case vue.source when "2" then statut.Libelle end as heberg
     
    from v_statut_passager as vue
     
    join t_passager as passager         on passager.Id = vue.Passager
    join t_typelogement as logement     on logement.id = vue.TypeLogement
    join t_statut as statut             on statut.id = vue.Statut
    join t_source as source             on source.id = vue.source
     
     
    where vue.Residence = 43
     
    #group by passager.Id
     
    order by passager.Nom, passager.Prenom
    Je me retrouve avec deux tuples qui représentent la même personne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom	prenom	libelle	aglae		heberg
    DUPONT	Bob	T1	Occupation	NULL
    DUPONT	Bob	T1	NULL		Réservation
    L'idée serait de récupérer un truc comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nom	prenom	libelle	aglae		heberg
    DUPONT	Bob	T1	Occupation	Réservation

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    il faut faire un group by :

    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
     
    SELECT passager.ine, passager.nom, passager.prenom, logement.libelle, 
    max(case vue.source when "1" then statut.Libelle end) AS aglae, 
    max(case vue.source when "2" then statut.Libelle end) AS heberg
     
    FROM v_statut_passager AS vue
     
    JOIN t_passager AS passager         ON passager.Id = vue.Passager
    JOIN t_typelogement AS logement     ON logement.id = vue.TypeLogement
    JOIN t_statut AS statut             ON statut.id = vue.Statut
    JOIN t_source AS source             ON source.id = vue.source
     
     
    WHERE vue.Residence = 43
     
    group by passager.Nom, passager.Prenom, logement.libelle
     
    ORDER BY passager.Nom, passager.Prenom

  3. #3
    Membre régulier
    Profil pro
    profiler
    Inscrit en
    Février 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : profiler

    Informations forums :
    Inscription : Février 2008
    Messages : 84
    Points : 99
    Points
    99
    Par défaut
    Bonsoir,

    Merci, ça semble marcher. Tu me dis qu'il faut que j'utilise un group by, c'est ce que j'essayais (cf la ligne en commentaire).

    Tu rajoutes un max() autour des cases et c'est ce qui semble faire que la mayo prenne. Histoire de comprendre ce qu'il se passe, pourrais tu expliquer stp ?

    Merci en tout cas !

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    en fait c'est un artifice qui est basé sur le fait que max te renverra la valeur non nulle (si elle existe) de ton groupage...

  5. #5
    Membre régulier
    Profil pro
    profiler
    Inscrit en
    Février 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : profiler

    Informations forums :
    Inscription : Février 2008
    Messages : 84
    Points : 99
    Points
    99
    Par défaut
    Donc si j'ai bien compris, le group by (par défaut) ne va pas chercher à analyser tous les enregistrements retournés mais juste les grouper. Avec le max(), ça va traiter chaque groupement ?

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    l'idée pour comprendre de manière simple les choses c'est:
    • on recherche dans la table principale selon les conditions de la clause where en appliquant les jointures éventuelles pour obtenir le jeu de résultats
    • on regroupe et trie (éventuellement) grâce à ce que tu as dans la clause group by ensuite et, s'il y a une clause having, on élimine éventuellement une partie des résultats ainsi obtenu


    les fonctions ensemblistes sont donc appelées pour chaque résultats que regroupe le group by pour faire évoluer la valeur à retourner tout en la conservant entre chaque appel (contrairement aux fonctions classiques).

    la plupart des fonctions ensemblistes (dont notamment min, max), si tu as aucune valeur te retourne null sinon te retourne la première valeur valide...

    ici par exemple: max(null,'Réservation')='Réservation'

  7. #7
    Membre régulier
    Profil pro
    profiler
    Inscrit en
    Février 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : profiler

    Informations forums :
    Inscription : Février 2008
    Messages : 84
    Points : 99
    Points
    99
    Par défaut
    C'est bien ce qu'il me semblait.

    Merci bien !

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

Discussions similaires

  1. Comportement différent des listes [] et des tuples () ??
    Par JujuKéblo dans le forum Général Python
    Réponses: 2
    Dernier message: 12/10/2005, 09h08
  2. [VB.NET][ADO]Fusionner des dataTables
    Par neo.51 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 30/07/2005, 00h22
  3. [SQL server] Comment Fusionner des données dans une requête
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 15h24
  4. [JTable] Fusionner des cellules
    Par Rimk78 dans le forum Composants
    Réponses: 2
    Dernier message: 13/05/2005, 15h53
  5. [] [Excel] Fusionner des cellules
    Par SamyD dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/12/2002, 18h37

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