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

Informix Discussion :

Regrouper plusieurs lignes en une seule


Sujet :

Informix

  1. #1
    Candidat au Club
    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 :


    [TH]ppdndo[/TH]
    [TH]npdlib[/TH]
    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 :


    [TH]ppdndo[/TH]
    [TH]npdlib[/TH]
    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

    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.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Candidat au Club
    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 :



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

  4. #4
    Rédacteur

    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 +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  5. #5
    Candidat au Club
    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
    Invité
    Invité(e)
    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
    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