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

Discussion :

Regrouper plusieurs lignes en une seule


Sujet :

Informix

  1. #1
    Candidat au Club
    Femme Profil pro
    Technicienne de l'information médicale
    Inscrit en
    août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicienne de l'information médicale
    Secteur : Santé

    Informations forums :
    Inscription : août 2011
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Regrouper plusieurs lignes en une seule
    Bonjour,

    J'ai appris par moi-même à faire des requêtes SQL, malheureusement j'ai des grosses lacunes d'autant plus que mon SGBD est INFORMIX et que beaucoup de fonctions existe dans d'autres SGBD mais pas pour INFORMIX

    Voilà mon problème, j'ai une table T_PDEJ qui me permet de récupérer une liste de numéro de patient (ppdndo) dans une colonne et ce qu'ils prennent au petit-déjeuner (ndplib) dans la deuxième. Comme ils ne prennent pas qu'une seule chose, je me retrouve à avoir plusieurs lignes par patients. Je souhaiterais les regrouper pour obtenir le numéro du patient dans la première colonne et dans la deuxième, la liste des éléments de son petit-déjeuner avec un séparateur entre chaque. Le nombre de ligne varie par patient.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select ppdndo, npdlib 
    from 
    T_PDEJ 
    group by ppdndo
    Voilà ce que j'obtiens :

    ppdndo npdlib
    409 beurre
    409 jus de fruit
    409 cafe au lait
    409 sucre
    409 pain
    450 biscottes
    450 gateaux
    2311 beurre
    2311 café
    2311 pain
    2311 lait (bol)

    et voilà ce que j'aimerais obtenir :

    ppdndo npdlib
    409 beurre, jus de fruit, cafe au lait, sucre,pain
    450 biscottes, gateaux
    2311 beurre, café, pain, lait (bol)

    J'ai essayé des fonctions de d'autres SGBD (GROUP_CONCAT, LISTAGG... WITHIN IN...) mais ça ne fonctionne pas.

    Si quelqu'un peut m'aider ce serait un soulagement car je ne sais vraiment pas comment me sortir de mon problème.

    Sophie

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 154
    Points : 26 335
    Points
    26 335
    Par défaut
    Avant que ces fonctions soient implémentées par divers SGBD, la réponse classique était
    "C'est juste de la mise en forme, de la cosmétique. Ce n'est pas au SGBD de faire ce travail, mais à l'application qui récupère les données."
    Ce qui est tout à fait juste d'un point de vue de logique relationnelle.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Candidat au Club
    Femme Profil pro
    Technicienne de l'information médicale
    Inscrit en
    août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicienne de l'information médicale
    Secteur : Santé

    Informations forums :
    Inscription : août 2011
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse al1_24

    comme j'exécute cette requête dans excel via msquery, c'est directement dans excel que je vais devoir trouver une astuce ?

    Le souci est que ce n'est qu'un petit bout de ma requête, j'ai plein d'info à aller récupérer dans des tables différentes et du coup je me retrouve à avoir au final des lignes répétées x fois selon les données des patients, voilà ce que je récupère dans excel :

    Nom : liste patient .png
Affichages : 74
Taille : 92,7 Ko

    Par exemple ma chambre CH01 F, j'ai 4 lignes

  4. #4
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    19 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 060
    Points : 44 930
    Points
    44 930
    Par défaut
    Si votre version d'INFORMIX le supporte, vous pouvez faire cela avec une requête récursive. Voir l'aticle que j'ai écrit à ce sujet :
    https://sqlpro.developpez.com/cours/...te-recursives/
    et en particulier :
    https://sqlpro.developpez.com/cours/...ursives/#LIV-D

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  5. #5
    Candidat au Club
    Femme Profil pro
    Technicienne de l'information médicale
    Inscrit en
    août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicienne de l'information médicale
    Secteur : Santé

    Informations forums :
    Inscription : août 2011
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci pour la réponse SQLpro.... (et désolée pour le retard de la mienne)

    En faisant mes recherches j'étais tombée sur ton article mais je ne suis pas technicien informatique de formation (et encore moins développeur) et j'avoue que je ne me sens pas capable de tester les requêtes récursives

    Merci encore pour la proposition.

    A+

  6. #6
    Membre actif Avatar de IFA2377
    Homme Profil pro
    Développeur Gestion (Retraité)
    Inscrit en
    novembre 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur Gestion (Retraité)
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2007
    Messages : 147
    Points : 223
    Points
    223
    Par défaut Ecrire un programme "ace"
    Tu peux résoudre ton problème par un simple programme d'édition "ace" qui te crée un fichier à loader dans une table temporaire. Ensuite, c'est du SQL simple.

    Je n'ai pas écrit une ligne de code depuis plus de dix ans mais ça devrait ressembler à ça…

    Il y a beaucoup commentaire (entre accolades), notamment le shell à la fin du programme.

    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
    140
    141
    142
    143
    {===================================== pde  ===================================}
    {                                                                              }
    {   ACE    :  pde.ace                                                          }
    {                                                                              }
    {   SHELL  :  ../shell/pde                                                     }
    {                                                                              }
    {   AUTEUR :  timso                                                            }
    {                                                                              }
    {   Objet  :  Creation fichier ${LOGNAME}.out                                  }
    {                                                                              }
    {   Date   :  13 juin 2018                                                     }
    {                                                                              }
    {==============================================================================}
    
                                {======================}
    {===========================}   DATABASE tde END   {===========================}
                                {======================}
    
    {================================}  DEFINE  {==================================}
    {}                                                                            {}
    {     PARAM[1] p_logname     CHAR(8)                                           }
    {}                                                                            {}
    {}    VARIABLE v_npdlib      CHAR(38)                                         {}
    {}                                                                            {}
    {     VARIABLE ESC           CHAR(1)                                           }
    {}                                                                            {}
    {==================================}  END  {===================================}
    
    {==================================  INPUT  ===================================}
    {}                                                                            {}
    {     PROMPT FOR v_saisie USING " SAISIE : "                                   }
    {}                                                                            {}
    {===================================  END  ====================================}
    
    {================================}  OUTPUT  {==================================}
    {}                                                                            {}
    {     REPORT TO PRINTER                                                        }
    {}    REPORT TO PIPE "cat > ${LOGNAME}.out"                                   {}
    {}    TOP    MARGIN 0                                                         {}
    {}    BOTTOM MARGIN 0                                                         {}
    {}    LEFT   MARGIN 0                                                         {}
    {}    PAGE   LENGTH 60                                                        {}
    {     TOP OF PAGE "^L"                                                         }
    {}                                                                            {}
    {==================================}  END  {===================================}
    
    {=================================}  SELECT  {=================================}
    
            t_pde.ppdndo           t_pde_ppdndo,
            t_pde.npdlib           t_pde_npdlib
            
    FROM    t_pde
           
    {===============================}  ORDER  BY  {================================}
    
             t_pde_ppdndo
                    
    {==================================}  END  {===================================}
    
    {=================================}  FORMAT  {=================================}
    
    {----------------------}  BEFORE GROUP OF t_pde_ppdndo {-----------------------}
    
    LET v_npdlib = NULL
    
    {----------------------------  FIRST PAGE  HEADER  ----------------------------}
    
    {------------------------------}  PAGE  HEADER  {------------------------------}
    {
    LET ESC = ASCII 027
    }
    {------------------------------}  ON EVERY ROW  {------------------------------}
    
    {------------------------  TRAITEMENT  LIGNE COURANTE  ------------------------}
    
    IF v_npdlib IS NULL
    THEN LET v_npdlib = t_pde_npdlib CLIPPED
    ELSE LET v_npdlib = v_npdlib CLIPPED, ", ", t_pde_npdlib CLIPPED
    
    {--------------------------  TRAITEMENT FIN DE PAGE  --------------------------}
    
    {------------------------  TRAITEMENT EN-TETE DE PAGE  ------------------------}
    
    {----------------------  FIN TRAITEMENT EN-TETE DE PAGE  ----------------------}
    
    {------------------------------------} END {-----------------------------------}
    
    {-----------------------------  AFTER EVERY ROW  ------------------------------}
    
    {----------------------}  AFTER GROUP OF t_pde_ppdndo   {----------------------}
    
    PRINT t_pde_ppdndo, "|", v_npdlib CLIPPED, "|"
    
    {------------------------------- PAGE  TRAILER --------------------------------}
    
    {-------------------------------  ON LAST ROW  --------------------------------}
    
    { - Reinitialisation de l'imprimante "HP LASERJET"                             }
    
    {===================================}  END  {==================================}
    
    {==================================== SHELL ===================================}
    {
    # pde
    
    #           Parametres
    # LOGNAME = Logname
    
    clear
    
    echo ".pde--------------------------------------------------------------------."
    echo "|                                                                       |"
    echo "|TRAITEMENT ?    [Entree]=OK, [Del/Suppr]=Abandon                       |"
    echo ".-----------------------------------------------------------------------."
    
    echo ""
    
    cd ../shell
    
    if test -f $(LOGNAME).out
       then rm $(LOGNAME).out
    fi
    
    SMSO=`tput smso`
    RMSO=`tput rmso`
    
    # TRAITEMENT
      tput cup 2 14
      echo $SMSO" "$RMSO
      tput cup 2 14
      read REPONSE
      tput cup 2 14
      echo " "
    
    tput cup 4 0
    echo " Traitement en cours... \c"
    
    sacego -q ../ace/pde
    
    echo " TERMINE !"
    }
    {==============================================================================}

  7. #7
    Candidat au Club
    Femme Profil pro
    Technicienne de l'information médicale
    Inscrit en
    août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicienne de l'information médicale
    Secteur : Santé

    Informations forums :
    Inscription : août 2011
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci encore pour vos réponses SQLPRO et IFA2377.

    Je me suis penchée sur les requêtes récursives et je n'arrive pas mettre en pratique

    Pour ce qui est de ta réponse IFA2377, merci encore mais alors là je suis encore plus perdue qu'avec les requêtes récursives (en fait c'est carrément du chinois :p ). C'est peut-être qqchose de basique à mettre en place mais encore une fois je n'ai aucune formation en informatique et en développement, j'apprends au fur et à mesure toute seule et là je vois que je suis au bout de ce que je sais/peux faire.

    En tout cas merci encore d'avoir pris le temps de me répondre (et rapidement).

    Je vais essayer de résoudre mon problème avec le vba d'excel.

    Bonne journée

Discussions similaires

  1. Regrouper plusieurs lignes dans une seule
    Par djinpark1 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2013, 13h26
  2. [AC-2003] Regrouper plusieurs lignes en une seule
    Par DeFCrew dans le forum IHM
    Réponses: 2
    Dernier message: 20/12/2010, 16h19
  3. Regrouper plusieurs lignes en une seule
    Par Nicolerst dans le forum Développement
    Réponses: 2
    Dernier message: 18/08/2010, 10h50
  4. Regrouper plusieurs lignes sur une seule
    Par Mygush dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/09/2009, 11h05
  5. Regrouper données plusieurs ligne en une seule
    Par willytito dans le forum Access
    Réponses: 2
    Dernier message: 03/09/2007, 10h35

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