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 :

[2005] Utilisation de PIVOT


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut [2005] Utilisation de PIVOT
    Bonjour,

    j'ai bcp de mal à comprendre l'utilisation de PIVOT et UNPIVOT.
    Est-ce que par exemple vous pourriez me dire comment avec ces opérateurs je peux obtenir une table (résultat de requête) dont les colonnes seraient 1, 2, ..., 9 avec une ligne où il n'y aurait que des valeurs 'A' pour chaque colonne et une ligne où il n'y aurait que des valeurs 'B' ?

    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
     
    ; WITH AB (
     Lettre
    )
    AS
    (
     SELECT 'A'
     UNION
     SELECT 'B'
    )
    , 1A9 (
     Chiffre
    )
    AS
    (
     SELECT 1
     UNION
     SELECT 2
     UNION
     SELECT 3
     UNION
     SELECT 4
     UNION
     SELECT 5
     UNION
     SELECT 6
     UNION
     SELECT 7
     UNION
     SELECT 8
     UNION
     SELECT 9
    )
     
    ???
    Citation Envoyé par Résultat souhaité
    1|2|3|4|5|6|7|8|9
    A|A|A|A|A|A|A|A|A
    B|B|B|B|B|B|B|B|B
    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    L'utilisation des opérateurs PIVOT et UNPIVOT requiert l'utilisation d'une fonction d'aggrégation. Les colonnes proviennent des valeurs du SELECT.
    Un bon exemple par Pinal Dave ici.

    Je suppose que vous l'avez lu, mais je le répète : ces deux opérateurs ne sont pas ensemblistes de par le simple fait qu'ils gèrent de la présentation de données, ce qui est normalement à déplacer du côté de l'application cliente de la base de données

    @++

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Je suppose que vous l'avez lu, mais je le répète : ces deux opérateurs ne sont pas ensemblistes de par le simple fait qu'ils gèrent de la présentation de données, ce qui est normalement à déplacer du côté de l'application cliente de la base de données
    Mais non mais non, si vous avez l'œil vous aurez reconnu :
    http://www.developpez.net/forums/d82...hallenge-15-a/

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Oui , mais l'introduction est pourtant claire :

    This challenge is derived from a realistic reporting scenario that requires the transformation of rows into columns. This is commonly known as a matrix, pivot, or crosstab query
    Ce qui est en gras dans la citation peut tout à fait être traité par une application SSRS, ou par Excel, qui sont conçus pour cela

    @++

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Mais non mais non, si vous avez l'œil vous aurez reconnu :
    http://www.developpez.net/forums/d82...hallenge-15-a/
    Pas exctement, c'est bien parce les tsql challenge que mon intention a été retenue sur PIVOT/UNPIVOT depuis la solution au challenge 11 (11, je crois).

    Mais, c'est pour une requête à usage personnel que j'aimerais comprendre mieux PIVOT et UNPIVOT.

  6. #6
    Expert confirmé
    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 : 47
    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
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Oui , mais l'introduction est pourtant claire :

    Ce qui est en gras dans la citation peut tout à fait être traité par une application SSRS, ou par Excel, qui sont conçus pour cela

    @++
    Effectivement tu as raison, je pense qu'ici il faut savoir que cela existe même si cela reste de la cosmétique ... et en terme de performance ce n'est pas ce qu'il y a de mieux .. Je crois qu'on est toujours d'accord hein

    Cependant il arrive que même sur Excel, le client final veuille disposer de ses données sous la forme finale , sans avoir à faire un tableau croisé dynamique (si si j'ai vu ) donc l'utilisation de l'opérateur PIVOT ou SELECT avec des CASES devient obligatoire ... Bien sûr il faut faire le choix entre comodité et performance dans ce cas là.

    >> Sergejack : Cela me paraît difficile de faire ce que vous voulez ... l'opérateur PIVOT aggrège les données (COUNT, AVG, MAX etc ...) comme pour un tableau dynamique sur Excel. La requête que vous voulez sortir ne se base pas sur ce principe ...

    ++

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    J'ai trouvé comment faire.

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Citation Envoyé par mikedavem
    Effectivement tu as raison, je pense qu'ici il faut savoir que cela existe même si cela reste de la cosmétique ... et en terme de performance ce n'est pas ce qu'il y a de mieux .. Je crois qu'on est toujours d'accord hein

    Cependant il arrive que même sur Excel, le client final veuille disposer de ses données sous la forme finale , sans avoir à faire un tableau croisé dynamique (si si j'ai vu ) donc l'utilisation de l'opérateur PIVOT ou SELECT avec des CASES devient obligatoire ... Bien sûr il faut faire le choix entre comodité et performance dans ce cas là.
    Effectivement nous sommes toujours d'accord .

    Mais, pour avoir fait un peu de VBA Excel, je reste persuadé que l'on peut écrire une macro qui, s'exécutant à l'ouverture du fichier, pourrait effectuer ce genre de traitements

    @++

  9. #9
    Expert confirmé
    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 : 47
    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
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    J'ai trouvé comment faire.
    Et cela donne ?

    ++

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Et cela donne ?

    ++
    Je n'ai pas conservé le code, mais c'est pas sorcier.

    - isolation de la table source du pivot en mettant les deux dans un sous query
    - utilisation de query dynamiques
    - pour obtenir notre liste de colonne : utilisation de la clause "FOR XML PATH('')" afin de concaténner des lignes de table en une seule chaîne ou (et les puristes préfereront peut-être) utilisation de CTE récursive pour faire la concaténation.

    EDIT : ha ben, j'ai encore les bases du code finallement :

    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
     
    DECLARE @Columns VARCHAR(100)
     
    ; WITH A19 (
     Chiffre
    )
    AS
    (
     SELECT 10
     UNION
     SELECT 21
     UNION
     SELECT 35
     UNION
     SELECT 47
     UNION
     SELECT 59
     UNION
     SELECT 61
     UNION
     SELECT 72
     UNION
     SELECT 80
     UNION
     SELECT 93
    )
    , SConcat
    (
    	S
    )
    AS
    (
    	SELECT
    		STUFF((
    			SELECT 
    				', [' + CAST(Chiffre AS VARCHAR) + ']'
    			FROM A19
    			FOR XML PATH('')
    		) , 1, 2, '')
     
    )
     
    SELECT S
    FROM SConcat
    /*
    SELECT 
    	P.*
    FROM AB
    CROSS APPLY (
    	SELECT *
    	FROM A19
    	PIVOT (MIN(Lettre) FOR Chiffre IN ([1], [2])) AS P
    ) AS P
     
    AB (
     Lettre
    )
    AS
    (
     SELECT 'A'
     UNION
     SELECT 'B'
    )
    */

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

Discussions similaires

  1. [SQL SERVER 2005] Utilisation de Exec dans une fonction ?
    Par Dadou74 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 22/09/2006, 23h09
  2. [VB.NET 2005] Utilisation Api Avifil32
    Par guillaume1998 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 01/09/2006, 15h09
  3. [VB 2005] Utilisation de la classe Clipboard
    Par Bob Langlade dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/05/2006, 04h20
  4. [VB 2005] Utilisation DLL - fichier C
    Par Carew dans le forum Windows Forms
    Réponses: 17
    Dernier message: 06/05/2006, 19h09
  5. utilisation de "PIVOT" et TRANSFORM"
    Par boris_ska dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 15/06/2005, 14h00

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