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

Développement SQL Server Discussion :

Passer de ligne à colonnes


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2018
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Passer de ligne à colonnes
    Bonjour, je suis actuellement bloqué car je cherche à transformer une table SQL de cette forme :

    Nom : 07I8exB.png
Affichages : 214
Taille : 182,0 Ko

    Sous cette forme la (recrée sur Excel) :

    Nom : 505ed832d8.png
Affichages : 138
Taille : 16,5 Ko

    J'ai vu plusieurs post sur internet concernant ceci, mais je n'arrive pas à le faire correctement.
    Je me retrouve avec une requête sous cette forme :

    Nom : d0c368c3e1.png
Affichages : 143
Taille : 17,7 Ko


    Voici le code que j'ai mis en place :

    Code : 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
    SELECT 
    D.[Dimension Set Id]
    ,(CASE  D.[Axe ID] WHEN 1 THEN D.[Analytic Value Name] END) AS 'Axe 1' 
    ,(CASE  D.[Axe ID] WHEN 2 THEN D.[Analytic Value Name] END) AS 'Axe 2' 
    ,(CASE  D.[Axe ID] WHEN 3 THEN D.[Analytic Value Name] END) AS 'Axe 3' 
    ,(CASE  D.[Axe ID] WHEN 4 THEN D.[Analytic Value Name] END) AS 'Axe 4' 
    ,(CASE  D.[Axe ID] WHEN 5 THEN D.[Analytic Value Name] END) AS 'Axe 5' 
    ,(CASE  D.[Axe ID] WHEN 6 THEN D.[Analytic Value Name] END) AS 'Axe 6' 
    ,(CASE  D.[Axe ID] WHEN 7 THEN D.[Analytic Value Name] END) AS 'Axe 7' 
    ,(CASE  D.[Axe ID] WHEN 8 THEN D.[Analytic Value Name] END) AS 'Axe 8' 
    ,(CASE  D.[Axe ID] WHEN 9 THEN D.[Analytic Value Name] END) AS 'Axe 9' 
    ,(CASE  D.[Axe ID] WHEN 10 THEN D.[Analytic Value Name] END) AS 'Axe 10' 
    FROM
    dbo.[BI_STD Analytic TEST] D
    GROUP BY D.[Dimension Set Id],D.[Axe ID],D.[Analytic Value Name]
    ORDER BY D.[Dimension Set ID]
    Je travail sous SQL Server.

    Merci de votre aide

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2018
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Avancement
    Après plusieurs tentatives inefficaces et étant donné que je suis sur SQL Server, je pense que je vais essayer une requête PIVOT pour mon cas, mais je ne comprend pas du tout comment la mettre en place, je trouve les explications des sites très peu explicites..

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Bonjour Valeze,

    Gardez ce lien au chaud

    https://fadace.developpez.com/mssql/pivot/

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2018
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci de votre aide, je regarde ça

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2018
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Probablement résolu :D
    Re, je crois avoir réussi grâce au lien de escartefigue, je suis arrivé sur une requête de ce style :



    Code : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    CREATE TABLE #result
    (
    [Dimension Set Id] int, 
    [Axe1] nvarchar(80),
    [Axe2] nvarchar(80), 
    [Axe3] nvarchar(80),  
    [Axe4] nvarchar(80),
    [Axe5] nvarchar(80), 
    [Axe6] nvarchar(80), 
    [Axe7] nvarchar(80),  
    [Axe8] nvarchar(80),  
    [Axe9] nvarchar(80),  
    [Axe10]nvarchar(80)
    )
     
     
    INSERT INTO #result
    SELECT 
    DISTINCT [Dimension Set Id], 'N/A' [Axe1], 'N/A' [Axe2], 'N/A' [Axe3], 'N/A' [Axe4], 'N/A' [Axe5], 'N/A' [Axe6], 'N/A' [Axe7], 'N/A' [Axe8], 'N/A' [Axe9], 'N/A' [Axe10]
    FROM
    dbo.[BI_STD Analytic TEST]
     
    UPDATE #result 
    set [Axe1] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 1 
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    UPDATE #result 
    set [Axe2] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 2 
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    UPDATE #result 
    set [Axe3] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 3
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    UPDATE #result 
    set [Axe4] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 4
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    UPDATE #result 
    set [Axe5] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 5 
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    UPDATE #result 
    set [Axe6] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 6 
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    UPDATE #result 
    set [Axe7] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 7 
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    UPDATE #result 
    set [Axe8] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 8 
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    UPDATE #result 
    set [Axe9] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 9 
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    UPDATE #result 
    set [Axe10] = B.[Analytic Value]
    FROM dbo.[BI_STD Analytic TEST] B, #result R	
    WHERE [Axe ID] = 10 
    AND R.[Dimension Set ID] = B.[Dimension Set ID]
    GO
    SELECT * FROM #result ORDER BY ([Dimension Set Id])
    DROP TABLE #result
    Pour un résultat ressemblant à ceci :

    Nom : 2dd82acdd1.png
Affichages : 113
Taille : 12,3 Ko

    Voila encore merci, c'était le site qu'il me fallait !
    j'ai vu de plus qu'il y avait d'autre facon de le faire, si je l'améliore je le posterai ici pour les personnes ayant le même soucis que moi

    je mettrai ce post en résolu après avoir effectuer quelque test pour vérifier si tout est bon

  6. #6
    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
    bonjour,

    En effet, il y a d'autres méthodes, et elles seront probablement plus performantes.

    Vous n'êtes pas loin avec votre requete initiale.
    Mais comme le but et de n'avoir plus qu'une ligne par [Dimension Set Id], cette colonne doit être la seule dans la clause GROUP BY.

    Il faudra du coup ajouter une fonction d'agrégation autour des CASE WHEN, par exemple MIN ou MAX, peu importe, son seul rôle dans le cas présent étant d'éliminer les NULL, bien visible dans le tableau que vous avez posté.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2018
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Exact, en ce qui me concerne le traitement est assez performant au final (moins d'une minute pour des millions d'enregistrement)
    Et les valeurs sont correct, donc résolu !

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

Discussions similaires

  1. Passer de 4 colonnes à 3 sur 2 lignes
    Par hizoka dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/02/2018, 13h04
  2. Réponses: 10
    Dernier message: 27/09/2016, 20h22
  3. Group By / Passer des lignes en colonnes
    Par star112 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/12/2011, 08h56
  4. Passer de ligne en colonne
    Par tavarlindar dans le forum Requêtes
    Réponses: 5
    Dernier message: 03/11/2010, 13h28
  5. Passer de lignes multiples à des colonnes
    Par LDPDC dans le forum Oracle
    Réponses: 4
    Dernier message: 30/10/2009, 22h36

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