Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/03/2011, 10h02   #1
Invité de passage
 
Homme
Consultant en Business Intelligence
Inscription : novembre 2004
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : novembre 2004
Messages : 8
Points : 1
Points : 1
Par défaut requete lignes en colonnes

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.
drbs est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 31/03/2011, 10h10   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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:
http://fadace.developpez.com/mssql/pivot/
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 10h16   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
je pense que même avec PIVOT, il aura du mal, le nombre de lignes ne semble pas défini :

Citation:
A,B1,B2,...,Bn
La question est donc : dans quelle but voulez-vous faire ça ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 10h34   #4
Invité de passage
 
Homme
Consultant en Business Intelligence
Inscription : novembre 2004
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : novembre 2004
Messages : 8
Points : 1
Points : 1
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
drbs est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 31/03/2011, 10h37   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
ok

La question était plutot :
pourquoi vouloir mettre ça en une ligne, pourquoi ne pas garder la structure actuelle (une ligne par item)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 10h37   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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
Mais dans tout les cas pourquoi voulez vous absolument le mettre en colonne?
Faite un traitement dans votre code client!
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 31/03/2011, 10h42   #7
Invité de passage
 
Homme
Consultant en Business Intelligence
Inscription : novembre 2004
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : novembre 2004
Messages : 8
Points : 1
Points : 1
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 ?
drbs est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 31/03/2011, 10h45   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 10h49   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par drbs Voir le message
et je voudrais récupérer les items de chaque commande,
en nombre variable suivant la commande
Citation:
Envoyé par drbs Voir le message
je dois ramener un nombre fixe de colonnes ?


Laissez ces données tel qu'elles sont, le nombre de colonnes sera bien fixe, et le nombre d'items bien variable
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 10h52   #10
Invité de passage
 
Homme
Consultant en Business Intelligence
Inscription : novembre 2004
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : novembre 2004
Messages : 8
Points : 1
Points : 1
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).
drbs est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 31/03/2011, 13h37   #11
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Laissez ces données tel qu'elles sont, le nombre de colonnes sera bien fixe, et le nombre d'items bien variable
Ce sera la conclusion ce que vous tentez de faire c'est la mal ...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 02/04/2011, 16h21   #12
Expert Confirmé Sénior

 
Avatar de fsmrel
 
Spécialiste en bases de données
Inscription : septembre 2006
Messages : 2 882
Détails du profil
Informations professionnelles :
Activité : Spécialiste en bases de données
Secteur : Conseil

Informations forums :
Inscription : septembre 2006
Messages : 2 882
Points : 5 116
Points : 5 116
Bonjour,


Citation:
Envoyé par drbs Voir le message
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 ?
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 :
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 :
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 :
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 :
1
2
3
SELECT * 
FROM   MaVue
ORDER BY A ;
=>

Code :
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]
__________________
_
Faites simple, mais pas plus simple ! (A. Einstein)
E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
=> La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

__________________

Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)
fsmrel est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 02/04/2011, 23h15   #13
Invité de passage
 
Homme
Consultant en Business Intelligence
Inscription : novembre 2004
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : novembre 2004
Messages : 8
Points : 1
Points : 1
Merci de votre réponse
drbs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 23h02   #14
Invité régulier
 
Inscription : septembre 2005
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 51
Points : 6
Points : 6
merci beaucoup, ma requête fonctionne maintenant.
Louisa2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h46.


 
 
 
 
Partenaires

Hébergement Web