OVH Cloud OVH Cloud

sql server 2005 pivot + concatenation ou agregation

2 réponses
Avatar
Helter Skelter
Bonjour,
je viens de decouvrir la fonction "pivot" permettant le regroupement de
données (mais tous les exemples parlent de colonnes numériques !).

moi je veux a partir d'une "famille" creer une colonne contenant toutes les
sous_famille de niveau 1 uniquement(donc concatener du string !). Je suppose
que la fonction pivot est bien indiquée pour faire ceci.
ma table contient les champs suivants
id, id_categorie, parent, niveau, famille, s-famille

je travaille en asp.net 2 vb avec sql 2005

je rajoute qu'il existe une fonction "LISTAGG" mais qui ne marche pas avec
sql server 2005
exemple :
CREATE TABLE Strings (String VARCHAR(20))

INSERT Strings VALUES ('A')
INSERT Strings VALUES ('B')
INSERT Strings VALUES ('C')

agregation:
SELECT LISTAGG(String) FROM Strings

résultat:
'A, B, C'

---------------------

il existe bien ceci
SELECT String + ', ' AS [text()]
FROM Strings
ORDER BY String
FOR XML PATH('')

mais le FOR XML PATH('') est rejeté par le pivot !

voici ma requette pivot (mais sans agregation)

DECLARE ze_Cursor CURSOR FOR
SELECT id, id_categorie, parent, niveau, rayon, famille
FROM T_Tree
WHERE niveau = '0' or niveau ='1'

OPEN ze_Cursor

--parcourir les enregistrements du curseur.
FETCH NEXT FROM ze_Cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM ze_Cursor
END

CLOSE ze_Cursor
DEALLOCATE ze_Cursor



merci pour votre aide

2 réponses

Avatar
Fred BROUARD
Bonjour,

Helter Skelter a écrit :
Bonjour,
je viens de decouvrir la fonction "pivot" permettant le regroupement de
données (mais tous les exemples parlent de colonnes numériques !).



Vous pouvez le faire avec n'importe quelle données.


moi je veux a partir d'une "famille" creer une colonne contenant toutes les
sous_famille de niveau 1 uniquement(donc concatener du string !).



la concaténation n'a rine à voir avec des fonctions statistiques de
calculs d'agrégats.

Je suppose
que la fonction pivot est bien indiquée pour faire ceci.



pas du tout !

ma table contient les champs suivants
id, id_categorie, parent, niveau, famille, s-famille

je travaille en asp.net 2 vb avec sql 2005

je rajoute qu'il existe une fonction "LISTAGG" mais qui ne marche pas avec
sql server 2005
exemple :
CREATE TABLE Strings (String VARCHAR(20))

INSERT Strings VALUES ('A')
INSERT Strings VALUES ('B')
INSERT Strings VALUES ('C')

agregation:
SELECT LISTAGG(String) FROM Strings

résultat:
'A, B, C'

---------------------

il existe bien ceci
SELECT String + ', ' AS [text()]
FROM Strings
ORDER BY String
FOR XML PATH('')

mais le FOR XML PATH('') est rejeté par le pivot !

voici ma requette pivot (mais sans agregation)

DECLARE ze_Cursor CURSOR FOR
SELECT id, id_categorie, parent, niveau, rayon, famille
FROM T_Tree
WHERE niveau = '0' or niveau ='1'

OPEN ze_Cursor

--parcourir les enregistrements du curseur.
FETCH NEXT FROM ze_Cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM ze_Cursor
END

CLOSE ze_Cursor
DEALLOCATE ze_Cursor



merci pour votre aide





pour résoudre ce problème vous pouvez soit :
1) implémenter une UDF et l'apeller dans la requête SELECT
2) utiliser une CTE (expression de table)

Sur la CTE, lisez l'article (en anglais) que j'ai écrit :
http://www.sqlservercentral.com/columnists/fBROUARD/recursivequeriesinsql1999andsqlserver2005.asp
vous y verrez comment faire une concaténation (entre autres).

A +

--
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.datasapiens.com ***********************
Avatar
Helter Skelter
Merci frederic et meilleurs voeux
je file voir vos liens...

"Fred BROUARD" a écrit dans le message de news:
%
Bonjour,

Helter Skelter a écrit :
Bonjour,
je viens de decouvrir la fonction "pivot" permettant le regroupement de
données (mais tous les exemples parlent de colonnes numériques !).



Vous pouvez le faire avec n'importe quelle données.


moi je veux a partir d'une "famille" creer une colonne contenant toutes
les sous_famille de niveau 1 uniquement(donc concatener du string !).



la concaténation n'a rine à voir avec des fonctions statistiques de
calculs d'agrégats.

Je suppose que la fonction pivot est bien indiquée pour faire ceci.



pas du tout !

ma table contient les champs suivants
id, id_categorie, parent, niveau, famille, s-famille

je travaille en asp.net 2 vb avec sql 2005

je rajoute qu'il existe une fonction "LISTAGG" mais qui ne marche pas
avec sql server 2005
exemple :
CREATE TABLE Strings (String VARCHAR(20))

INSERT Strings VALUES ('A')
INSERT Strings VALUES ('B')
INSERT Strings VALUES ('C')

agregation:
SELECT LISTAGG(String) FROM Strings

résultat:
'A, B, C'

---------------------

il existe bien ceci
SELECT String + ', ' AS [text()]
FROM Strings
ORDER BY String
FOR XML PATH('')

mais le FOR XML PATH('') est rejeté par le pivot !

voici ma requette pivot (mais sans agregation)

DECLARE ze_Cursor CURSOR FOR
SELECT id, id_categorie, parent, niveau, rayon, famille
FROM T_Tree
WHERE niveau = '0' or niveau ='1'

OPEN ze_Cursor

--parcourir les enregistrements du curseur.
FETCH NEXT FROM ze_Cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM ze_Cursor
END

CLOSE ze_Cursor
DEALLOCATE ze_Cursor



merci pour votre aide



pour résoudre ce problème vous pouvez soit :
1) implémenter une UDF et l'apeller dans la requête SELECT
2) utiliser une CTE (expression de table)

Sur la CTE, lisez l'article (en anglais) que j'ai écrit :
http://www.sqlservercentral.com/columnists/fBROUARD/recursivequeriesinsql1999andsqlserver2005.asp
vous y verrez comment faire une concaténation (entre autres).

A +

--
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.datasapiens.com ***********************