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

SQLite Discussion :

Regroupement de montant par année


Sujet :

SQLite

  1. #1
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut Regroupement de montant par année
    Bonjour,

    J'ai une table qui contient les créances de nos clients, il existe deux champs que je voudrais utiliser "date_facture" et "montant_facture".
    En exécutant la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select substr(date_facturation,7,4) as annee, sum(montant_facture)
    from tmp_creances_clients
    group by annee
    order by annee  desc
    j'obtiens le résultat suivant :


    annee montant_facture
    2022 7654.82
    2021 1518.95
    2020 18218.39
    2019 165744.34
    2018 46991.41
    2017 76701.13
    2016 447148.53
    2015 17713.54
    2014 17713.54
    2000 159766.95
    1999 6558.68
    1998 1031.14

    Ce que je voudrais c'est d'avoir les quatre premières années 2022, 2021, 2020, 2019 à part et de regrouper le reste des montants des années 2018 et antérieur dans l'année 2018.

    Merci par avance pour vos réponses

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 308
    Points : 13 059
    Points
    13 059
    Par défaut
    Bonjour,
    Je ne sais pas si SqlLite accepte ce genre d'écriture, à tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select (case when substr(date_facturation,7,4) < '2019' then '2018' else substr(date_facturation,7,4) end)  as annee, sum(montant_facture)
    from tmp_creances_clients
    group by annee
    order by annee  desc
    Il ne reste plus qu'à ajouter un calcul pour ne pas avoir à spécifier "en dur" l'année de bascule.

    Tatayo.

  3. #3
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Merci,

    Ça marche sur Sqlite3, mais
    Il ne reste plus qu'à ajouter un calcul pour ne pas avoir à spécifier "en dur" l'année de bascule.
    Je vais essayer de le trouver.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select strftime('%Y',current_date)-4
    donc ceci devrait fonctionner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select (case when strftime('%Y',date_facturation) < strftime('%Y',current_date)-3 then strftime('%Y',current_date)-4 else substr(date_facturation,7,4) end)  as annee, sum(montant_facture)
    from tmp_creances_clients
    group by annee
    order by annee  desc

  5. #5
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Merci infiniment.

  6. #6
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    Dans le même contexte j'ai voulu utilisé la requête modifiée, pour regrouper les montants selon les 5 dernières années jusqu'à l'an 2018 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT (CASE WHEN max(annee) < max(annee) -4
                             THEN max(annee) -5 ELSE max(annee) END) AS annee, 
                             ROUND(SUM(montant_facture), 2) AS montant, 
                             ROUND(SUM(montant_facture)/t.total_general * 100, 2) AS taux 
                             FROM tmp_creances_clients,
                             (SELECT SUM(montant_facture) AS total_general FROM tmp_creances_clients a) AS t
                             GROUP BY annee
                             ORDER BY annee DESC
    mais, le résultat affiche l'ensemble des années dans la table comme ceci :

    Nom : liste.png
Affichages : 333
Taille : 6,5 Ko

    Est ce que j'ai oublier quelque chose ???
    Merci

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par noureddine1967 Voir le message
    Est ce que j'ai oublié quelque chose ?
    Oui, d'utiliser la colonne date_facturation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    *
    SELECT (CASE WHEN strftime('%Y',date_facturation) < strftime('%Y',date_facturation) -4
                             THEN strftime('%Y',date_facturation) -5 ELSE strftime('%Y',date_facturation) END) AS annee, 
                             ROUND(SUM(montant_facture), 2) AS montant, 
                             ROUND(SUM(montant_facture)/t.total_general * 100, 2) AS taux 
                             FROM tmp_creances_clients, (SELECT SUM(montant_facture) AS total_general FROM tmp_creances_clients a) AS t
                             GROUP BY annee
                             ORDER BY annee DESC
    si SQlite supporte les CTE j'écrirai plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH T AS (SELECT SUM(montant_facture) AS total_general FROM tmp_creances_clients a)
    SELECT (CASE WHEN strftime('%Y',c.date_facturation) < strftime('%Y',c.date_facturation) -4
                             THEN strftime('%Y',c.date_facturation) -5 ELSE strftime('%Y',c.date_facturation) END) AS annee, 
                             ROUND(SUM(c.montant_facture), 2) AS montant, 
                             ROUND(SUM(c.montant_facture)/t.total_general * 100, 2) AS taux 
                             FROM tmp_creances_clients c JOIN  t ON 1=1
                             GROUP BY annee
                             ORDER BY annee DESC

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par noureddine1967 Voir le message
    Merci infiniment.
    il est d'usage de mettre un sur les réponses acceptées

  9. #9
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Merci SergioMaster,

    Seulement, je voudrais utilisé le champ "annee" au lieu date_facturation et groupé les montants de l'année 2018 et antérieur.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut
    Et alors ? Si je me base sur les premières réponses, je ne vois aucune colonne année dans la table tmp_creances_clients .

    Quand vous posez des questions SQL il est bon de fournir la structure de la table pour commencer.

  11. #11
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Merci SergioMaster pour votre patience,

    En effet, au début j'ai ecrit ma requête en fonction de la date de facturation.
    Mais, en raison de la date de facturation du dernier mois de l'année qui s'effectue au premier mois de l'année qui suit. Là, j'ai constaté que mes calculs sont, en quelques sorte, faussé.

    A cet effet, j'ai décidé d'extraire "l'année" du champ "num_facture" qui lui correspond exactement à l'année.

    Par conséquent, ma view "tmp_creances_clients" contient les champs suivants : code_client, num_facture, date_facturation, montant et annee

    Dans le même contexte j'ai voulu utilisé la requête modifiée, pour regrouper les montants selon les 5 dernières années jusqu'à l'an 2018 :
    Ainsi, à partir de la dernière année, "MAX(annee)" qui est 2022, je calcul mes soldes : 2021, 2020, 2019 et je cumul le reste avec l'année 2018.
    J'espère qui j'ai bien pu expliquer mon problème.

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par noureddine1967 Voir le message
    pour votre patience
    Je ne vous le fais pas dire !

    Mais, en raison de la date de facturation du dernier mois de l'année qui s'effectue au premier mois de l'année qui suit.
    Clair comme de la vase ! Mais je ne vais pas épiloguer, tout comme je ne vais pas écrire qu'un script de création de table ainsi qu'un script de remplissage de données test permettrait de faire une réponse contrôlée

    voici ma proposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH T AS (SELECT SUM(montant_facture AS total_general, max(annee) AN FROM tmp_creances_clients)
    SELECT (CASE WHEN T.AN< T.AN -4 THEN TAN-5 ELSE TAN) AS annee, 
                             ROUND(SUM(c.montant_facture), 2) AS montant, 
                             ROUND(SUM(c.montant_facture)/t.total_general * 100, 2) AS taux 
                             FROM tmp_creances_clients c JOIN  t ON 1=1
                             GROUP BY annee
                             ORDER BY annee DESC

  13. #13
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Merci encore,

    J'ai exécuter votre requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH T AS (SELECT SUM(montant_facture) AS total_general, MAX(annee) AS AN FROM tmp_creances_clients a)
    SELECT (CASE WHEN T.AN<T.AN-4 THEN T.AN-5 ELSE T.AN END) AS annee, 
    ROUND(SUM(c.montant_facture), 2) AS montant, 
    ROUND(SUM(c.montant_facture)/T.total_general * 100, 2) AS taux 
    FROM tmp_creances_clients c JOIN T ON 1=1
    GROUP BY annee
    ORDER BY annee DESC
    Le résultat affiche uniquement l'année 2022:
    Nom : Sans titre.png
Affichages : 308
Taille : 4,6 Ko

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut
    Ah, j'aurais pu le découvrir si j'avais eu un jeu d'essai. Comme j'ai écrit le SQL à la volée, j'ai fait des confusions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH T AS (SELECT SUM(montant_facture) total_general, MAX(annee) AN FROM tmp_creances_clients a)
    SELECT (CASE WHEN c.annee>T.AN-4 THEN c.Annee else  T.an-4 END)  annee, 
    ROUND(SUM(c.montant_facture), 2) montant, 
    ROUND(SUM(c.montant_facture)/T.total_general * 100, 2)  taux 
    FROM tmp_creances_clients c JOIN T ON 1=1
    GROUP BY annee
    ORDER BY annee DESC

  15. #15
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Pour éliminer toute confusion j'ai remplacé annee_r par exercice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    WITH T AS (SELECT SUM(montant_facture) AS total_general, MAX(annee) AS AN FROM tmp_creances_clients a)
    SELECT (CASE WHEN T.AN < T.AN-4 THEN T.AN-5 ELSE T.AN END) AS exercice, 
    ROUND(SUM(c.montant_facture), 2) AS montant, 
    ROUND(SUM(c.montant_facture)/T.total_general * 100, 2) AS taux 
    FROM tmp_creances_clients c JOIN T ON 1=1
    GROUP BY exercice
    ORDER BY exercice DESC
    Cette fois le résultat une seule ligne :
    Nom : Sans titre.png
Affichages : 306
Taille : 1,3 Ko

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut
    mon dernier post est corrigé, et grâce à un jeu d'essai bidon
    Nom : Capture.PNG
Affichages : 317
Taille : 17,3 Ko

    on ne m'otera pas de la tête qu'avec des fonctions de fenêtrage https://www.sqlite.org/windowfunctions.html il serait possible de faire quelque chose, mais je maitrise mal

  17. #17
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Merci SergioMaster,

    Mais, j'ai dû remplacer annee par exercice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    WITH T AS (SELECT SUM(montant_facture) AS total_general, MAX(annee) AS AN FROM tmp_creances_clients a)
    SELECT (CASE WHEN c.annee >T.AN-4 THEN c.annee ELSE T.AN-4 END) AS exercice, 
    ROUND(SUM(c.montant_facture), 2) AS montant_an, 
    ROUND(SUM(c.montant_facture)/T.total_general * 100, 2) AS taux
    FROM tmp_creances_clients c JOIN T ON 1=1
    GROUP BY exercice
    ORDER BY exercice DESC
    Nom : Sans titre.png
Affichages : 303
Taille : 3,5 Ko

  18. #18
    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
    Points : 18 395
    Points
    18 395
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    on ne m'otera pas de la tête qu'avec des fonctions de fenêtrage https://www.sqlite.org/windowfunctions.html il serait possible de faire quelque chose, mais je maitrise mal
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with cte_exercice (exercice, montant_facture) as
    (
    select max(annee, max(annee) over() -4)
         , montant_facture
      from tmp_creances_clients
    )
      select exercice
           , round(sum(montant_facture), 2) as montant_an
           , round(100 * sum(montant_facture) / sum(sum(montant_facture)) over(), 2) as taux
        from cte_exercice
    group by exercice
    order by exercice desc;

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut

    d'un autre côté, cela dépend de la version de SQLite

  20. #20
    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
    Points : 18 395
    Points
    18 395
    Par défaut
    J'ai essayé sur les versions 3.27.2 et 3.39.1, celles proposées sur db<>fiddle :

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Regrouper des dates par année?
    Par Kawaccino dans le forum QlikView
    Réponses: 2
    Dernier message: 20/05/2021, 15h26
  2. Regrouper des données par année
    Par EverybodyEthan dans le forum Langage
    Réponses: 3
    Dernier message: 26/01/2021, 15h17
  3. [XL-2003] Regrouper par année et cumul
    Par Etila dans le forum Excel
    Réponses: 9
    Dernier message: 23/04/2009, 11h50
  4. [AC-2003] Regroupement par année
    Par Etila dans le forum Requêtes et SQL.
    Réponses: 24
    Dernier message: 22/04/2009, 14h07
  5. Regroupement par année
    Par bob75000 dans le forum Access
    Réponses: 6
    Dernier message: 22/08/2006, 17h15

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