Equivalent de la fonction d'agregat LIST

Le
Xavier
Bonjour à tous,
je cherche a concaténer des champs avec une fonction de type sum mais pour
les char.
En SQL/99 j'ai trouvé la fonction LIST ex :

SELECT LIST(id_employee,';') FROM employee
groupy BY id_pays=2;
//renvoie par ex
//1;2;5;8
//liste des employées dont le pays est 2

Par contre je ne vois pas cette fonction dans sql server 2005

Pouvez-vous me dire si cette fonction existe dans sql server?
Si oui comment l'utiliser
Si non quelles sont les autres alternatives.


Merci d'avance
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred BROUARD
Le #11882791
Xavier a écrit :
Bonjour à tous,
je cherche a concaténer des champs avec une fonction de type sum mais
pour les char.
En SQL/99 j'ai trouvé la fonction LIST ex :

SELECT LIST(id_employee,';') FROM employee
groupy BY id_pays=2;
//renvoie par ex
//1;2;5;8
//liste des employées dont le pays est 2



désolé de vous contredire mais cette fonction n'existe pas dans la norme
SQL, et n'existera jamais, car une telle fonction comme celle que
propose MySQL avec GROUP_CONCAT est totalement anti relationnelle.

En effet les tables sont des objets ensembliste et une telle opération
effectuée sur une colonne rendra, par essence, un résultat aléatoire.
Exemple :
NOM
---------
DURAND
MARTIN
MULLER

peut rendre tantôt :
DURAND, MULLER, MARTIN
ou
MULLER, MARTIN, DURAND
ou
MULLER, DURAND, MARTIN
...

Il faudrait en effet maîtriser l'ordre de la concaténation et donc
introduire un autre paramètre ce que les fonctions d'agrégation ne
permettent pas !

En revanche, si vous voulez faire cela, et à la norme SQL, il convient
d'utiliser une requête récursive introduite par une CTE (Common Table
Expression, en français Expression de table).


Voici un exemple que je vais mettre dans la 2e édition de mon ouvrage
sur SQL :

CREATE TABLE T_PHRASE_PHR
(PHR_ID INTEGER NOT NULL,
PHR_MOT_POSITION INTEGER NOT NULL,
PHR_MOT VARCHAR(32) NOT NULL,
CONSTRAINT PK_PHR PRIMARY KEY (PHR_ID, PHR_MOT_POSITION));

INSERT INTO T_PHRASE_PHR VALUES (1, 1, 'Le')
INSERT INTO T_PHRASE_PHR VALUES (1, 2, 'petit')
INSERT INTO T_PHRASE_PHR VALUES (1, 3, 'chat')
INSERT INTO T_PHRASE_PHR VALUES (1, 4, 'est')
INSERT INTO T_PHRASE_PHR VALUES (1, 5, 'mort')
INSERT INTO T_PHRASE_PHR VALUES (2, 1, 'Les')
INSERT INTO T_PHRASE_PHR VALUES (2, 2, 'sanglots')
INSERT INTO T_PHRASE_PHR VALUES (2, 3, 'longs')
INSERT INTO T_PHRASE_PHR VALUES (2, 4, 'des')
INSERT INTO T_PHRASE_PHR VALUES (2, 5, 'violons')
INSERT INTO T_PHRASE_PHR VALUES (2, 6, 'de')
INSERT INTO T_PHRASE_PHR VALUES (2, 7, 'l''')
INSERT INTO T_PHRASE_PHR VALUES (2, 8, 'automne')
INSERT INTO T_PHRASE_PHR VALUES (2, 9, 'blessent')
INSERT INTO T_PHRASE_PHR VALUES (2, 10, 'mon')
INSERT INTO T_PHRASE_PHR VALUES (2, 11, 'coeur')
INSERT INTO T_PHRASE_PHR VALUES (2, 12, 'd''')
INSERT INTO T_PHRASE_PHR VALUES (2, 13, 'une')
INSERT INTO T_PHRASE_PHR VALUES (2, 14, 'langueur')
INSERT INTO T_PHRASE_PHR VALUES (2, 15, 'monotone')

WITH
phrases (phrase, id, position)
AS
(
SELECT CAST(PHR_MOT AS VARCHAR(max))
+ CASE
WHEN SUBSTRING(PHR_MOT, LEN(PHR_MOT), 1) = '''' THEN ''
ELSE ' '
END, PHR_ID, PHR_MOT_POSITION
FROM T_PHRASE_PHR
WHERE PHR_MOT_POSITION = 1
UNION ALL
SELECT phrase + CAST(PHR_MOT AS VARCHAR(max))
+ CASE
WHEN SUBSTRING(PHR_MOT, LEN(PHR_MOT), 1) = '''' THEN ''
ELSE ' '
END AS PHRASE,
PHR_ID, PHR_MOT_POSITION
FROM T_PHRASE_PHR AS suiv
INNER JOIN phrases
ON suiv.PHR_ID = phrases.id
AND suiv.PHR_MOT_POSITION = phrases.position + 1
),
maxphrase
AS
(
SELECT id, MAX(position) AS maxposition
FROM phrases
GROUP BY id
)
SELECT P.id, phrase + '.' AS PHRASE
FROM phrases AS P
INNER JOIN maxphrase AS M
ON P.id = M.id
AND P.position = M.maxposition
ORDER BY id


Ceci recompose les phrase parsée en colonne et y rajoute le point final.


Pour une étude plus complete sur la CTE et sur la récusivité dans SQL,
lisez l'étude que j'ai publié :
http://sqlpro.developpez.com/cours/sqlserver/cte-recursives/

A +





Par contre je ne vois pas cette fonction dans sql server 2005

Pouvez-vous me dire si cette fonction existe dans sql server?
Si oui comment l'utiliser
Si non quelles sont les autres alternatives.


Merci d'avance






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Publicité
Poster une réponse
Anonyme