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:
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
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:
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 !"
}
{==============================================================================} |