IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

requete lignes en colonnes


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    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 : 11
    Points
    11
    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.

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    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/

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    je pense que même avec PIVOT, il aura du mal, le nombre de lignes ne semble pas défini :

    A,B1,B2,...,Bn
    La question est donc : dans quelle but voulez-vous faire ça ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    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 : 11
    Points
    11
    Par défaut
    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

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    ok

    La question était plutot :
    pourquoi vouloir mettre ça en une ligne, pourquoi ne pas garder la structure actuelle (une ligne par item)

  6. #6
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    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!

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    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 : 11
    Points
    11
    Par défaut
    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 ?

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    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...

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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

  10. #10
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    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 : 11
    Points
    11
    Par défaut
    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).

  11. #11
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    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 ...

  12. #12
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 100
    Points : 31 536
    Points
    31 536
    Billets dans le blog
    16
    Par défaut
    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 : 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]

  13. #13
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    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 : 11
    Points
    11
    Par défaut
    Merci de votre réponse

  14. #14
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    merci beaucoup, ma requête fonctionne maintenant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] probleme de requete sql transposer ligne et colonne
    Par nicogef dans le forum Access
    Réponses: 1
    Dernier message: 16/06/2015, 19h38
  2. [AC-2007] requetes - transformer lignes en colonnes
    Par nesswaffle dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 16/07/2014, 09h14
  3. requete transformation Lignes en colonnes
    Par Meher001 dans le forum Développement
    Réponses: 12
    Dernier message: 27/02/2013, 10h39
  4. [Access SQL]Requetes SQL pour "inverser" ligne et colonne
    Par trihanhcie dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/07/2007, 13h12
  5. Réponses: 5
    Dernier message: 27/06/2006, 20h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo