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 :

GROUP BY intervalle de dates


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 2
    Par défaut GROUP BY intervalle de dates
    Bonjour à tous

    Petit nouveau sur le forum, je sollicite votre aide pour un problème que je rencontre et où je sèche complètement.

    Je cherche à faire un SELECT avec un GROUP BY sur une date à plus ou moins 3 jours.

    Par exemple, dans la table suivante :
    Client DateCommande Montant
    123456 01/07/2021 10
    123456 03/07/2021 20
    123456 05/07/2021 50

    Je souhaiterai avoir en résultat du SELECT :

    Client Montant NbCommandes
    123456 30 2
    123456 80 3
    123456 70 2

    J'ai essayé avec un GROUP BY DATEDIFF(day,0,DATE_COMMANDE)/3 mais le résultat n'est pas celui attendu.

    J'espère avoir été assez clair.

    Merci d'avance

    PC

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Bonjour,

    Si je voulais associer une commande et la commande du lendemain, je ferais ainsi :
    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
    WITH    lst
        AS  (   SELECT  client
                    ,   datecommande
                    ,   montant
                FROM    matable
            UNION ALL
                SELECT  client
                    ,   datecommande - 1
                    ,   montant
                FROM    matable jr1
                WHERE   EXISTS
                        (   SELECT  1
                            FROM    matable jr0
                            WHERE   jr0.datecommande    = jr1.datecommande - 1
                                AND jr0.client          = jr1.client
                        )
            )
    SELECT  client
        ,   datecommande
        ,   SUM(montant)    AS  montant
    FROM    lst
    GROUP BY client
        ,   datecommande
    Je te laisse étendre le principe...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  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
    A cause du manque d'implémentation des fonctions de fenêtrage dans SQL-Server, il vous faut une auto-jointure ici :
    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
    create table MaTable
    ( Client       integer
    , DateCommande date
    , Montant      integer
    );
     
    insert into MaTable values
    (123456, '2021-07-01', 10),
    (123456, '2021-07-03', 20),
    (123456, '2021-07-05', 50);
     
      select t1.Client, t1.DateCommande, t1.Montant
           , sum(t2.Montant), count(t2.Client)
        from MaTable as t1
        join MaTable as t2  on t2.Client        = t1.Client
                           and t2.DateCommande >= dateadd(day, -3, t1.DateCommande)
                           and t2.DateCommande <= dateadd(day,  3, t1.DateCommande)
    group by t1.Client, t1.DateCommande, t1.Montant
    order by t1.Client, t1.DateCommande;

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 2
    Par défaut
    Merci pour vos retours
    Je vois ça rapidement et je reviens vers vous pour vous dire si c'est ok.

  5. #5
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Citation Envoyé par Waldar Voir le message
    A cause du manque d'implémentation des fonctions de fenêtrage dans SQL-Server...
    je suis assez surpris et voudrais comprendre ce manque.
    Merci d'avance

  6. #6
    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
    Sur Postgresql, Oracle Database et même MySQL 8, on peut écrire cette requête, à la syntaxe de l'intervalle près :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      select Client, DateCommande, Montant
           , sum(Montant) over(partition by Client order by DateCommande asc range between interval '3 days' preceding and interval '3 days' following) as MontantPM3jours
           , count(*)     over(partition by Client order by DateCommande asc range between interval '3 days' preceding and interval '3 days' following) as NbCommandes
        from MaTable
    order by Client, DateCommande;

  7. #7
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Merci de la réponse
    Je viens de tester une requête sur sql server, il me donne l'erreur:
    RANGE est uniquement pris en charge avec les délimiteurs de cadres de fenêtre UNBOUNDED et CURRENT ROW.
    Sur Postgres la requête...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select Client, DateCommande, Montant
          , sum(Montant) over(partition by Client 
    						  order by DateCommande 
    						  range between '3 day' preceding 
    						  and '3 day' following)
    	   , count(Montant) over(partition by Client 
    						  order by DateCommande 
    						  range between '3 day' preceding 
    						  and '3 day' following)
       from MaTable
    passe bien.
    @+

Discussions similaires

  1. SQL GROUP BY intervalle de date
    Par Junior_jef dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 26/04/2007, 15h53
  2. calculer un intervalle de dates
    Par vodevil dans le forum Modules
    Réponses: 3
    Dernier message: 16/01/2006, 20h04
  3. Intervalle de Dates
    Par Philofish dans le forum Langage SQL
    Réponses: 6
    Dernier message: 06/09/2005, 11h02
  4. selection intervalle de dates
    Par jax69 dans le forum Access
    Réponses: 2
    Dernier message: 22/06/2005, 13h58
  5. Réponses: 9
    Dernier message: 17/01/2004, 10h51

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