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 :

Problème pivot table dynamique


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut Problème pivot table dynamique
    Bonjour,

    Je cherche à créer une requête sql qui va me retourner un "pivot table" dynamique (je ne connais pas le nombre de colonne que la requête doit me retourner).

    Structure de la table
    Cola Colb
    FR US
    ES GB
    DE JP
    etc ...

    Le résultat souhaité
    US GB JP
    FR 1
    ES 1
    DE 1

    J'ai commencé avec cette requête pur SQL mais cela ne semble pas fonctionner. Et on m'a indiqué que je devais passer par du TSQL.

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Cola, count(Colb)
    FROM test pivot
    ( sum(value) FOR name IN Colb) t GROUP BY Cola
    Merci par avance pour votre aide.

    David

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    J'ai commencé à coder en TSQL, mais il me retourne une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msg 207, Level 16, State 1, Line 2
    Nom de colonne non valide*: 'Col'.
    Msg 207, Level 16, State 1, Line 2
    Nom de colonne non valide*: 'Colb'.
    Mon code est
    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
    DECLARE @columns VARCHAR(8000)
    SELECT @columns = COALESCE(@columns + ',[' + cast(Cola as varchar) + ']',
    '[' + cast(Cola as varchar)+ ']')FROM test
    GROUP BY Cola
     
    DECLARE @query VARCHAR(8000)
    SET @query = '
    SELECT Cola, Colb
    FROM test
    PIVOT
    (
    count(Colb)
    FOR [Cola]
    IN (' + @columns + ')
    )
    AS p'
     
    EXECUTE(@query)
    Quelqu'un aurait une idée?

    Merci

    David

  3. #3
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Pour votre requête avec l'opérateur PIVOT : (Il ne vous reste plus qu'à adapter dans votre TSQL dynamique pour mettre les noms des colonnes adéquates)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Cola, [GB],[GP],[US]
    FROM test 
    PIVOT
    (COUNT(Colb) 
     FOR Colb IN ([GB],[GP],[US])) AS pvt 
    ORDER BY Cola;
    ++

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Merci pour ta réponse, mais maintenant j'ai un nouveau problème.

    Car il me retourne autant de ligne que j'ai dans ma table mais je voudrais qu'il groupe sur la colonne A

    Ex

    Cola Colb
    FR DE
    FR DE
    FR ES

    Résultat retourné
    Cola DE ES
    FR 1 0
    FR 1 0
    FR 0 1

    Résultat escompté

    Cola DE ES
    FR 2 1

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il faut construire l'aggrégat de la même façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT Cola, sum([GB]), sum([GP]), sum([US])
    FROM
    (
    SELECT Cola, [GB],[GP],[US]
    FROM test 
    PIVOT
    (COUNT(Colb) 
     FOR Colb IN ([GB],[GP],[US])) AS pvt 
    ) AS PIVOT
    GROUP BY Cola

Discussions similaires

  1. [XL-2010] Créer un fichier Excel avec Pivot Table dynamiquement
    Par JackylRadis dans le forum Conception
    Réponses: 0
    Dernier message: 31/05/2012, 16h38
  2. Problème de NULL sur un Pivot basé sur une Table Dynamique
    Par guilld dans le forum Développement
    Réponses: 3
    Dernier message: 01/08/2011, 15h05
  3. Problème pivot table dynamique
    Par chciken92000 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/09/2009, 14h17
  4. Problème Pivot Table
    Par zoidy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/07/2007, 06h47
  5. [C#]table dynamique problème de viewstate
    Par nicorem dans le forum ASP.NET
    Réponses: 3
    Dernier message: 15/12/2006, 15h52

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