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

Langage SQL Discussion :

Somme cumulée entre 2 bornes


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Somme cumulée entre 2 bornes
    Bonjour à tous, je viens vers vous car j'ai besoin d'aide sur une requête et qu'après de nombreuses recherches, je désespère un peu ...
    Pour info je travail sous BigQuery.

    Je dispose d'une table de ventes assez classique où j'ai déjà agrégé par Client / Pays / jour de commande / numéro de commande (OrderNumber) / Identifiant de Promotion (DiscountID = 78 ici) le CA associé.
    Disons que j'observe une fenêtre de 3 jours ici entre le 6 Juin et le 8 inclus.

    Customer Pays Date OrderNumber DiscountId CAHT
    A France 06/06/2019 14996 78 38
    B France 06/06/2019 22827 78 26
    B France 06/06/2019 22841 78 25
    C France 07/06/2019 21882 78 52
    A France 08/06/2019 20582 78 40

    J'aimerai avoir pour chaque combinaisons de Date le nb de clients et de commandes distincts ainsi que le CA cumulé, cela ressemblerait en sortie à ça :

    date_debut date_fin Pays DiscountId nb_clients nb_cmdes CA_cumulé
    06/06/2019 06/06/2019 France 78
    06/06/2019 07/06/2019 France 78
    06/06/2019 08/06/2019 France 78
    07/06/2019 07/06/2019 France 78
    07/06/2019 08/06/2019 France 78
    08/06/2019 08/06/2019 France 78

    J'ai essayé beaucoup de méthodes, à base de jointure sur la même table, de cross join, de sum (over Partition) etc ... mais je n'arrive jamais au résultat voulu ...

    En espérant avoir été clair dans mon message, merci d'avance pour votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,

    Désolé je ne connais pas Bigquery.
    Il est probable que quelqu'un d'autre fournisse une réponse plus pertinente.

    Je tenterais une requête union all entre des jeux de données correspondants aux différents délais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- 0 jour de décalage
    select date_deb, date_fin, pays, sum(caht)
    from (select date as date_deb, date+0 as date_fin, pays, caht from T) T2
    group by date_deb, date_fin, pays
    union all
    -- 1 jour de décalage
    select date_deb, date_fin, pays, sum(caht)
    from (select date as date_deb, date+0 as date_fin, pays, caht from T) T2
    group by date_deb, date_fin, pays
    ...
    --n jours de décalage
    On peut imaginer de construire cette requête dynamiquement dans une procédure qui accepte comme paramètre la valeur de n.

    Sans expertise sur les fonctions offerte, je n'ai pas mieux pour ce soir
    Le savoir est une nourriture qui exige des efforts.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Quelque chose dans ce goût-là :
    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    NOMBRE
        as  (   select  1   as  INCREMENT
            union all
                select  2
            union all
                select  3
            )
        ,    CALENDRIER
        as  (   select  distinct    DATE
                from    MATABLE
            )
        ,   PERIODE
        as  (   select  CAL.DATE                    as DATE_DEB
                    ,   CAL.DATE + INC.INCREMENT    as DATE_FIN
                from    CALENDRIER  as CAL
                    cross join
                        NOMBRE      as INC
            )
    select  PER.DATE_DEB
        ,   PER.DATE_FIN
        ,   SRC.PAYS
        ,   SRC.DISCOUNTID
        ,   count(distinct SRC.CUSTOMER)    as  NB_CLIENTS
        ,   count(SRC.ORDERNUMBER)          as  NB_CMDES
        ,   sum(SRC.CAHT)                   as  CA_CUMULE
    from    MATABLE     as  SRC
        inner join
            PERIODE     as  
            on  SRC.DATE    between PER.DATE_DEB and PER.DATE_FIN
    where   PER.DATE_DEB    = 'XXXX'
        ,   PER.DATE_FIN    = 'yyyy'
    group by  PER.DATE_DEB
        ,   PER.DATE_FIN
        ,   SRC.PAYS
        ,   SRC.DISCOUNTID
    A tester et éventuellement mettre au point
    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.

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Concernant la requête de Michel, je l'ai légèrement adapté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -- 0 jour de décalage
    select date_deb, date_fin, DomainId, DiscountId, sum(CAHT_Reel) as CA_cum
    from (select Date as date_deb, date_add(date, interval 0 day) as date_fin, DomainId, DiscountId, CAHT_Reel from base_now) T2
    group by date_deb, date_fin, DomainId, DiscountId
    union all
    -- 1 jour de décalage
    select date_deb, date_fin, DomainId, DiscountId, sum(CAHT_Reel) as CA_cum
    from (select Date as date_deb, date_add(date, interval 1 day) as date_fin, DomainId, DiscountId, CAHT_Reel from base_now) T2
    group by date_deb, date_fin, DomainId, DiscountId
    order by DomainId, DiscountId, date_deb, date_fin
    --> Le problème ici est que je me retrouve avec un CA identique quand je date_deb ne bouge pas (exemple j'ai le même CA quand je regarde du 6 au 6, du 6 au 7, du 6 au 8, etc ...)


    Concernant la requête de al1, après quelques corrections de coquilles (no worry), je me retrouve avec 1 seul ligne qui prend en paramètre :
    PER.DATE_DEB = 'XXXX'
    PER.DATE_FIN = 'yyyy'

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Citation Envoyé par Sebz_ Voir le message
    Concernant la requête de al1, après quelques corrections de coquilles (no worry), je me retrouve avec 1 seul ligne qui prend en paramètre :
    PER.DATE_DEB = 'XXXX'
    PER.DATE_FIN = 'yyyy'
    Je l'avais écrit qu'il y avait sans doute des corrections
    Sans doute cela sera plus efficace avec ce filtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where   PER.DATE_DEB    >= 'XXXX'
        and PER.DATE_FIN    <= 'yyyy'
    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.

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Top cela marche très bien merci beaucoup !

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

Discussions similaires

  1. [Math / Random] Génération nombre aléatoire compris entre deux bornes
    Par oligig dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 30/06/2013, 17h23
  2. Réponses: 8
    Dernier message: 10/05/2006, 22h50
  3. somme cumulative
    Par gsquad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2006, 17h18
  4. [Math] Générer un BigInteger aléatoire entre 2 bornes
    Par falcon dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 13/05/2005, 15h33
  5. Double somme (SUM) entre deux tables ?
    Par kibodio dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/02/2005, 22h26

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