Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fred BROUARD
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 *************************
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 *************************
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 *************************