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 :

SQL SERVER 2005 Pb de Pivot


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 14
    Par défaut SQL SERVER 2005 Pb de Pivot
    Bonjour,

    Je dois ecrire une requete pour afficher le chiffre d'affaire d'une société, la colonne pivot est le mois.
    J'ai une erreur dans la requete mais je ne comprend pas pourquoi ?

    voici le code de la requete :
    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
    SELECT t_cuno,t_nama,(SommeDet_amnt),MOIS
    FROM
    (SELECT     dbo.ttdsls045100.t_cuno, dbo.ttccom010100.t_nama, DATENAME(month,t_ddat) AS MOIS,Sum(dbo.ttdsls045100.t_amnt) AS SommeDet_amnt
    FROM         dbo.ttdsls045100 INNER JOIN
                          dbo.ttiitm001100 ON dbo.ttdsls045100.t_item = dbo.ttiitm001100.t_item INNER JOIN
                          dbo.ttccom010100 ON dbo.ttdsls045100.t_cuno = dbo.ttccom010100.t_cuno
    WHERE     (dbo.ttdsls045100.t_item < 'C ' OR
                          dbo.ttdsls045100.t_item > 'CZZ ' OR
                          dbo.ttdsls045100.t_item BETWEEN 'CDR' AND 'CDRZZ') AND 
    					dbo.ttdsls045100.t_ddat BETWEEN convert(DATETIME, '01-01-2011 00:00:00',103) AND convert(DATETIME, '31-12-2011 00:00:00',103) AND 
                          (dbo.ttiitm001100.t_citg BETWEEN 'Z00000' AND 'Zzzzzz' OR
                          dbo.ttiitm001100.t_citg BETWEEN 'A00000' AND 'Azzzzz' OR
                          dbo.ttiitm001100.t_citg BETWEEN 'F00800' AND 'F00899')
    GROUP BY dbo.ttdsls045100.t_cuno, dbo.ttccom010100.t_nama,DATENAME(month,t_ddat)) as tableSource
    PIVOT ( SUM(SommeDet_amnt) FOR DATENAME(month,t_ddat) IN ([janvier],[fevrier],[mars]))as CA

    le code de l'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 170, Level 15, State 1, Line 15
    Ligne 15 : syntaxe incorrecte vers 'PIVOT'.
    Un peu d'aide serai bienvenu.

    Cordialement

  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,

    C'est parce que l'opérateur PIVOT n’existe pas dans SQL Server 2005.
    Il a été implémenté dans SQL Server 2008.

    Néanmoins, le mieux est d’effectuer cela côté applicatif, puisque ce n'est pas un opérateur ensembliste.

    @++

  3. #3
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 14
    Par défaut
    Bonjour,

    Merci pour ta réponse, mais je ne suis pas d'accord, l'opérateur existe bien en SQL 2005, voici le lien MSDN

    http://msdn.microsoft.com/fr-fr/libr...v=SQL.90).aspx

    et un petit exemple pour voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT Produit, 
    	   SUM([2003]) AS [2003], 
    	   SUM([2004]) AS [2004], 
    	   SUM([2005]) AS [2005], 
    	   SUM([2006]) AS [2006] 
    FROM  Ventes
    PIVOT (SUM(Vente) FOR annee IN ([2003], [2004], [2005], [2006])) AS Annees
    GROUP BY Produit
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A	9000	10000	12000	12500
    B	NULL	18000	NULL	15000
    C	1100	850	1000	NULL
    Pour revenir à mon probléme, n'est-il pas plus simple d'utiliser la methode lourde qui utilise les sous requetes pour chaque mois ??

    A+

  4. #4
    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
    Par défaut
    bonjour

    Citation Envoyé par tchraad Voir le message
    et un petit exemple pour voir :
    exemple dans lequel PIVOT se trouve après la clause FROM, et non après la clause GROUP BY...

    que donne ceci (je n'ai pas lu la requete en entier...)
    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
     
    SELECT t_cuno,t_nama,(SommeDet_amnt),MOIS
    FROM
    (SELECT     dbo.ttdsls045100.t_cuno, dbo.ttccom010100.t_nama, DATENAME(month,t_ddat) AS MOIS,Sum(dbo.ttdsls045100.t_amnt) AS SommeDet_amnt
    FROM         dbo.ttdsls045100 INNER JOIN
                          dbo.ttiitm001100 ON dbo.ttdsls045100.t_item = dbo.ttiitm001100.t_item INNER JOIN
                          dbo.ttccom010100 ON dbo.ttdsls045100.t_cuno = dbo.ttccom010100.t_cuno
    PIVOT ( SUM(SommeDet_amnt) FOR DATENAME(month,t_ddat) IN ([janvier],[fevrier],[mars]))AS CA
    WHERE     (dbo.ttdsls045100.t_item < 'C ' OR
                          dbo.ttdsls045100.t_item > 'CZZ ' OR
                          dbo.ttdsls045100.t_item BETWEEN 'CDR' AND 'CDRZZ') AND 
    					dbo.ttdsls045100.t_ddat BETWEEN convert(DATETIME, '01-01-2011 00:00:00',103) AND convert(DATETIME, '31-12-2011 00:00:00',103) AND 
                          (dbo.ttiitm001100.t_citg BETWEEN 'Z00000' AND 'Zzzzzz' OR
                          dbo.ttiitm001100.t_citg BETWEEN 'A00000' AND 'Azzzzz' OR
                          dbo.ttiitm001100.t_citg BETWEEN 'F00800' AND 'F00899')
    GROUP BY dbo.ttdsls045100.t_cuno, dbo.ttccom010100.t_nama,DATENAME(month,t_ddat)) AS tableSource

  5. #5
    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
    OK, je prend zéro ... Désolé pour la boulette.

    J'ai rarement utilisé PIVOT, tellement qu'en fait je n'ai du l'utiliser que sous SQL Server 2008.

    ça ne change pas que cela ne devrait pas être fait côté base de données, puisque c'est de la présentation ...

    @++

  6. #6
    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 un léger doute sur le fait de pouvoir utiliser une express telle que DATENAME(month,t_ddat) plutôt qu'une colonne pour le pivot.
    De toute façon votre problème est clair : vous devez "encapsuler" (surtout avec un group by).

    Faites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT ....
    FROM (
     SELECT
      ...... AS ColonneQuiMinteresseVraiment1 -- Somme de la variance du total des achats partiellement impayées le samedi
    ,   ...... AS ColonneQuiMinteresseVraiment2 -- Encore pire
    ,  ...... AS ColonneQuiMinteresseVraiment3 -- J'en parle même pas
     FROM (
     <query de ouf>
     ) AS X
    ) AS X
    PIVOT ...
    Citation Envoyé par elsuket Voir le message
    ça ne change pas que cela ne devrait pas être fait côté base de données, puisque c'est de la présentation ...

    @++
    Faut pas boire tout ce que dit Sql Pro ^^

    Pivot et Unpivot sont d'ailleurs très utiles pour normaliser/dé-normaliser.

  7. #7
    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 : 43
    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
    Par défaut
    C'est parce que l'opérateur PIVOT n’existe pas dans SQL Server 2005
    Le PIVOT a été introduit dans SQL SERVER 2005... enfin en France, BANGKOK je sais pas :-)

    Un petit tuto sympas de fadace:
    http://fadace.developpez.com/mssql/pivot/

Discussions similaires

  1. [Installation]SQL Server 2005 Express Edition sur XP home
    Par Médiat dans le forum MS SQL Server
    Réponses: 15
    Dernier message: 06/08/2005, 18h22

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