Je me pose la question de ramener avec un select la pb suivante :
n lignes (clé A, B)
A,B1
A,B2
...
A,Bn
en 1 seule ligne : A,B1,B2,...,Bn
Comment puis-je faire avec Sql Server 2008 ?
Merci.
Je me pose la question de ramener avec un select la pb suivante :
n lignes (clé A, B)
A,B1
A,B2
...
A,Bn
en 1 seule ligne : A,B1,B2,...,Bn
Comment puis-je faire avec Sql Server 2008 ?
Merci.
Le PIVOT est votre ami:Je me pose la question de ramener avec un select la pb suivante :
n lignes (clé A, B)
A,B1
A,B2
...
A,Bn
en 1 seule ligne : A,B1,B2,...,Bn
Comment puis-je faire avec Sql Server 2008 ?
Merci.
http://fadace.developpez.com/mssql/pivot/
je pense que même avec PIVOT, il aura du mal, le nombre de lignes ne semble pas défini :
La question est donc : dans quelle but voulez-vous faire ça ?A,B1,B2,...,Bn
La colonne A corresponds à un Id de commande,
et je voudrais récupérer les items de chaque commande,
en nombre variable suivant la commande
ok
La question était plutot :
pourquoi vouloir mettre ça en une ligne, pourquoi ne pas garder la structure actuelle (une ligne par item)
Mais dans tout les cas pourquoi voulez vous absolument le mettre en colonne?La colonne A corresponds à un Id de commande,
et je voudrais récupérer les items de chaque commande,
en nombre variable suivant la commande
Faite un traitement dans votre code client!
Quelle serait la procédure, sachant que dans mon traitement après extraction avec la requête, je dois ramener un nombre fixe de colonnes ?
Quelle serait la procédure, sachant que dans mon traitement après extraction avec la requête, je dois ramener un nombre fixe de colonnes ?
A donc vous connaissez le nombre de colonne ?donc vous connaissez quelles 'B' seront remontées, si c'est le cas passez par des pivots, si le nombre de colonne ne sera pas fixe passez par un traitement côté application cliente...
Je pourrais avoir ceci :
A,B1,B2
C,D1
E,F1,F2,F3
Je ne connais pas a priori le nbre de colonnes, qui est variable suivant la commande.
Ou si cela est plus simple, pouvoir limiter dans ma requete le nbre
de colonnes à ramener (10 max par exemple).
Ce sera la conclusion ce que vous tentez de faire c'est la malLaissez ces données tel qu'elles sont, le nombre de colonnes sera bien fixe, et le nombre d'items bien variable...
Bonjour,
Une solution est d’utiliser l’union récursive, au moyen d’une CTE (Common Table Expression).
Créons par exemple la table MaTable :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE TABLE MaTable ( A CHAR(4) NOT NULL , B CHAR(4) NOT NULL , C VARCHAR(48) NOT NULL CONSTRAINT A_PK PRIMARY KEY (A, B) ) ;
Effectuons quelques INSERT :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 INSERT INTO MaTable VALUES ('a01', 'b11', 'blabla11') ; INSERT INTO MaTable VALUES ('a01', 'b12', 'blabla12') ; INSERT INTO MaTable VALUES ('a01', 'b13', 'blabla13') ; INSERT INTO MaTable VALUES ('a01', 'b14', 'blabla14') ; INSERT INTO MaTable VALUES ('a02', 'b21', 'blabla21') ; INSERT INTO MaTable VALUES ('a02', 'b22', 'blabla22') ; INSERT INTO MaTable VALUES ('a02', 'b23', 'blabla23') ; INSERT INTO MaTable VALUES ('a03', 'b31', 'blabla31') ; INSERT INTO MaTable VALUES ('a03', 'b32', 'blabla32') ; INSERT INTO MaTable VALUES ('a04', 'b41', 'blabla41') ;
Créons la vue Mavue, qui contient la requête d’union récursive :
Code SQL : 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 CREATE VIEW MaVue (A, NbElements, ListeElements) AS WITH V (A, B, Liste, Nb) AS ( SELECT MaTable.A, MaTable.B, CAST('[' + MaTable.B + '; ' + MaTable.C + ']' AS VARCHAR(MAX)), 1 FROM MaTable JOIN (SELECT '' as 'A, MIN(B)', A, MIN(B) AS B FROM MaTable GROUP BY A) AS T ON MaTable.A = T.A AND MaTable.B = T.B UNION ALL SELECT V.A, MaTable.B, CAST((Liste + ', ' + '[' + MaTable.B + '; ' + MaTable.C + ']') AS VARCHAR(MAX)), Nb + 1 FROM V JOIN MaTable ON MaTable.A = V.A AND MaTable.B > V.B ) SELECT V.A, V.Nb, V.Liste FROM V JOIN (SELECT A, MAX(Nb) AS MAX_Nb FROM V GROUP BY A) AS W ON V.A = W.A AND V.Nb = W.MAX_Nb ;
Allons au résultat :
=>
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM MaVue ORDER BY A ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 A NbElements ListeElements --- ---------- ------------- a01 4 [b11 ; blabla11], [b12 ; blabla12], [b13 ; blabla13], [b14 ; blabla14] a02 3 [b21 ; blabla21], [b22 ; blabla22], [b23 ; blabla23] a03 2 [b31 ; blabla31], [b32 ; blabla32] a04 1 [b41 ; blabla41]
Merci de votre réponse
merci beaucoup, ma requête fonctionne maintenant.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager