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 :

Requête pivot sur deux colonnes


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 82
    Par défaut Requête pivot sur deux colonnes
    Bonjour,

    J'aimerai faire une requête avec un double pivot :
    Explications : je la somme de pièces commandées sur 5 mois glissants et par année.
    Les cinq mois glissants peuvent être par exemple : Novembre, Décembre, Janvier, Février, Mars.
    Les années sont dans ce cas l'année en cours et l'année suivante : 2012, 2013 par exemple.
    Est-il possible de faire la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT SUM([@Mois1]),
              SUM([@Mois2]),
              SUM([@Mois3]),
              SUM([@Mois4]),
              SUM([@Mois5])
    FROM Table //Cette table contient les quantités et les dates
    INNER JOIN [Table et champ de jointures nécessaire]
    PIVOT(SUM(Quantite) FOR Table.Quantite IN (@Mois1, @Mois2, @Mois3, @Mois4, @Mois5))
    PIVOT(Annee FOR Table.Annee in (@annee1, @annee2))
    Le but d'utiliser cette solution est d'améliorer un peu le temps de réponse la requête.

    Merci pour vos réponses.

    Cordialement,

    Caillou

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 82
    Par défaut
    Bonjour,

    Personne n'a d'idées la dessus??

    Cordialement,

    Caillou

  3. #3
    Invité
    Invité(e)
    Par défaut
    Avec aussi peu d'information (titre du sujet pas explicite, pas de version, pas de DDL ni de volumétrie, pas d'information d'index, ni de plan d’exécution, requête partielle, etc...) vous aider reviendrait à de l'astrologie.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 82
    Par défaut
    Bonjour,

    Effectivement, certaines questions se posent :
    Le version du serveur : SQlL Server 2005.
    La volumétrie : au total entre toutes les jointures pour le moment : 100 000 lignes
    Les indexes : il y en a mais je ne connais pas les champs concernés.
    Mais surtout ce que j'aurai aimé savoir c'est si on peut utiliser la commande PIVOT deux fois dans la même sous-requête?


    Cordialement,

    Caillou.

  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
    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
     
    SELECT
    	c1
    	, c2
    	, ... 
    	, cn
    	, Quantite * SUM(ISNULL(Month1, 0)) AS Month1
    	, Quantite * SUM(ISNULL(Month2, 0)) AS Month2
    	, ...
    FROM [Tables jointes]
    CROSS APPLY (
    	SELECT
    		*
    	FROM (
    		SELECT 'Month1', 1
    		WHERE laDate >= @mois1
    		AND laDate < DATEADD(mm, 1, @mois1)
     
    		UNION ALL
     
    		SELECT 'Month2', 1
    		WHERE laDate >= @mois2
    		AND laDate < DATEADD(mm, 1, @mois2)
     
     
    		UNION ALL
     
    		SELECT 'Month3', 1
    		WHERE laDate >= @mois2
    		AND laDate < DATEADD(mm, 1, @mois3)
     
    		[...]
    	) AS X (m, v)
    	PIVOT (MIN(v) FOR m IN ([Month1], [Month2], ...)) AS Y
    ) AS X
    GROUP BY c1, c2, ..., cn

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 87
    Par défaut
    Citation Envoyé par Caillou63 Voir le message
    Bonjour,

    Effectivement, certaines questions se posent :
    Le version du serveur : SQlL Server 2005.
    La volumétrie : au total entre toutes les jointures pour le moment : 100 000 lignes
    Les indexes : il y en a mais je ne connais pas les champs concernés.
    Mais surtout ce que j'aurai aimé savoir c'est si on peut utiliser la commande PIVOT deux fois dans la même sous-requête?


    Cordialement,

    Caillou.

    Bonjour Caillou63,

    J'ai réussi a utiliser plusieurs PIVOT dans la même requête.
    Néanmoins, il faut effectuer votre deuxième pivot sur le résultat du premier.
    Je ne sais pas si je suis claire mais en gros il faut faire :


    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
     
    SELECT 
              SUM([@Mois1]),
              SUM([@Mois2]),
              SUM([@Mois3]),
              SUM([@Mois4]),
              SUM([@Mois5])
    FROM TABLE AS T
     
    PIVOT
    (
              SUM(T.Quantite) FOR T.Quantite IN (@Mois1, @Mois2, @Mois3, @Mois4, @Mois5)
    ) AS PIVOT1
     
    PIVOT
    (
              SUM(PIVOT1.Annee) FOR PIVOT1.Annee IN (@annee1, @annee2)
    ) AS PIVOT2

    Par contre, mes derniers tests ne sont pas concluant niveau perfs... Les temps d'exécution CPU sont à la ramasse avec l'utilisation de cette fonction PIVOT. Faire des vieux LEFT OUTER JOIN (subquery) semble être plus rapide


    Cdt,

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

Discussions similaires

  1. Requête avec comparaison dates sur deux colonnes
    Par DAVJO dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/02/2015, 11h22
  2. [SQL] Problème avec script de pagination et requête sql sur deux tables
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 15h06
  3. [Tableaux] Array sur deux colonnes et foreach..
    Par shadeoner dans le forum Langage
    Réponses: 4
    Dernier message: 16/03/2006, 09h46
  4. [CR] Faire un groupe sur deux colonnes, voir mon exemple
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 08/10/2004, 15h02

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