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 :

Requete pour un résultat sur 12 mois glissants


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 72
    Points : 46
    Points
    46
    Par défaut Requete pour un résultat sur 12 mois glissants
    Bonjour,

    Je souhaite exécuter une requête me ramenant l'année, le mois et le CA client et cela seulement sur les 12 derniers mois.

    Je veux m'en servir comme source pour un graph (evolution du CA client mensuel). Les résultats doivent être ordonnés du plus vieux au plus recent.

    Merci de votre aide

    Franck

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Avec quel SGBD ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Quel est la structure de la ou les tables à utiliser?
    Qu'as-tu écrit? On peut t'aider à compléter s'il le faut.
    Cordialement
    Soazig

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 72
    Points : 46
    Points
    46
    Par défaut
    C'est sur un sql serveur 2005.

    La requete est tres simple et du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select year(dt) as annee, month(dt) as mois, sum(ligne_ht_eur) as montant
    From ventes
    Group by annee, mois

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 055
    Points
    53 055
    Billets dans le blog
    6
    Par défaut
    Je suis en train d'écrire un article sur les fonctions de fenêtrage. Voici un exemple de ce que vous demandez...

    Voici l'article, avant parution (manque quelques corrections) :
    http://sqlpro.developpez.com/article...-window/#LII-C
    Exemples 8, 9 et 10.

    A +

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 72
    Points : 46
    Points
    46
    Par défaut
    J'ai trouvé une solution mais je ne sais pas si elle est correcte ou s'il y a plus simple.

    * je fais ma requête en triant année, mois en order by DESC
    * je prends le top (12) de la requête
    * je réordonne les données par SELECT * FROM ( ... ) as Tmp ORDER BY annee, mois

    avec ... représentant ma requête de départ ordonnée inverse


    Quelqu'un a t il une autre idee plus simple ?

    Un WHERE sur une borne datée (date_jour - 12 mois) par exemple

  7. #7
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    Bonjour,
    De mon coté j'ajouterai à votre requete une restriction en faisant appel à la fonction datediff.
    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT year(dt) AS annee, month(dt) AS mois, sum(ligne_ht_eur) AS montant
    FROM ventes
    WHERE DATEDIFF(mm, dt, getdate())<=12
    GROUP BY year(dt),month(dt)

  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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il sera préférable d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE dt BETWEEN DATEADD(month, -12, GETDATE()) AND GETDATE()
    De cette façon le prédicat devient SARGable et la requête peut utiliser un index sur la colonne dt

    @++

  9. #9
    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
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Il sera préférable d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE dt BETWEEN DATEADD(month, -12, GETDATE()) AND GETDATE()
    De cette façon le prédicat devient SARGable et la requête peut utiliser un index sur la colonne dt

    @++
    J'ai des gros doutes sur ces conclusions.
    J'ai déjà pu constater que SQL Server trouvait très souvent des synonimes qu'il puisse traiter aisément d'opérations définies de façon plus complexe (c'en est d'ailleurs parfois frustrant quand on cherche à forcer une approche à l'optimizer).

  10. #10
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Dans ce cas-ci on obtiendra les mêmes plans de requête, mais il faut bien se dire que c'est dû à l'intelligence de l'optimiseur de requête, qui doit calculer son arbre de résolution pareillement dans les deux cas.

    Cela dit j'ai vu des requêtes avec le même type de prédicat que celui proposé par Jero44 ne pas utiliser l'index qui porte sur la colonne date : tout simplement parce que les statistiques de colonnes ne sont pas maintenues sur valeurs de dates d'il y a un an, mais sur les valeurs courantes de la colonne.

    L'optimiseur est un robot qu'il est difficile de maîtriser, et il est inévitable de regarder le plan de requête, le nombre de pages lues et le temps nécessaire à l'exécution d'une requête ...

    @++

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 72
    Points : 46
    Points
    46
    Par défaut
    Merci pour vos infos.

    c'est le résultat que je souhaitais

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

Discussions similaires

  1. Macro Excel pour les doublons sur 3 mois glissants
    Par greenlightII dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 21/05/2013, 14h49
  2. requete oracle pour obtenir des montant sur 12 mois glissant
    Par gueulederack dans le forum Oracle
    Réponses: 7
    Dernier message: 16/06/2011, 15h06
  3. Optimisation Vue sur 12 mois glissants
    Par mout1234 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/06/2009, 13h42
  4. Somme cumulative sur 12 mois glissant
    Par Ptij16 dans le forum Deski
    Réponses: 6
    Dernier message: 13/07/2007, 10h24
  5. Requete pour comparer tables sur 2 schemas
    Par Kannuki dans le forum Oracle
    Réponses: 28
    Dernier message: 09/02/2006, 14h40

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