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

Requêtes MySQL Discussion :

Somme sur hiérarchies "imbriquées"


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Par défaut Somme sur hiérarchies "imbriquées"
    Bonjour !

    Je viens vers vous pour vous demander de l'aide pour une application de gestion de frais pour une entreprise. L'idée finale est d'afficher un récapitulatif des frais par mois sur une année glissante (avec total final), avec les totaux par départements, par personne et par type de frais. Les départements sont hiérarchisés, les types de frais aussi, et ces hiérarchies doivent être "respectées" dans les sommes (donc la somme d'un département contient les valeurs de ses départements descendants, idem pour les types de frais)
    Les personnes doivent être affichées dans l'ordre alphabétique, et il y a aussi des chefs de département qui doivent du coup apparaître avant les autres personnes du département.

    J'arrive à afficher mes sommes par département, par personne et par type de frais, dans l'ordre souhaité, mais maintenant je souhaiterais avoir le détail par type de frais pour les départements (toujours par mois sur une année glissante et avec le total sur cette année).
    Là où je bute, c'est sur le fait que j'ai donc une partie de mon arborescence que je dois sommer, mais qui se trouve à différents niveaux. Les types de frais sont les mêmes pour tous les départements, mais tous n'ont pas déclaré des frais de même type de surcroît. Et le détail par type de frais pour le département doit donc prendre en compte les détails de ses descendants.

    Comme j'ai de la peine à l'expliquer clairement (ce qui n'aide pas), je propose un exemple simplifié (et calculé à la main )
    Direction 1025
    Communication 425
    Mobile 325
    Courrier 100
    Déplacements 600
    Avion 500
    Train 100
    Jean Dupont 150
    Communication 150
    Mobile 130
    Courrier 20
    Jeanne Durand 650
    Communication 150
    Mobile 100
    Courrier 50
    Déplacements 500
    Avion 500
    Sous-département 1 195
    Communication 95
    Mobile 85
    Courrier 10
    Déplacements 100
    Train 100
    John Smith 155
    Communication 55
    Mobile 50
    Courrier 5
    Déplacements 100
    Train 100
    Jane Doe 40
    Communication 40
    Mobile 35
    Courrier 5
    Sous-département 2 30
    Communication 30
    Mobile 10
    Courrier 20
    Catherine Tamalou 20
    Communication 20
    Courrier 20
    Justine Bobola 10
    Communication 10
    Mobile 10
    Ce qu'il me manque actuellement, ce sont donc les lignes de types de frais entre celle qui contient le nom d'un département et la première personne qui suit.
    L'idéal serait de pouvoir récupérer toutes les lignes de mon tableau en une fois, pour faire mes essais j'ai séparé en deux (la partie "qui fonctionne" et celle qui me pose problème)

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,


    regardez du côté de GROUP BY / ROLLUP (voir CUBE au vu de la demande)

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Par défaut
    Bonjour,

    J'utilise effectivement déjà ces deux instructions pour la partie qui fonctionne. Ce qui me pose problème actuellement, c'est que j'ai donc N niveaux de départements et M niveaux de types de frais. Il est clair qu'il ne me manque pas grand-chose, parce que mes derniers essais me montrent le détail des éléments qui sont directement dans le département, et mon total est identique dans mes deux résultats. C'est probablement parce que j'effectue un ROLLUP sur un ensemble trop restreint de données… ou alors que j'ai des regroupements inutiles à un certain point, voire les deux.

    Il me vient à l'idée maintenant de faire des unions de groupes de M requêtes pour chaque niveau de département (soit quelque chose comme ça), mais ça ma paraît un peu lourd…

    Citation Envoyé par punkoff Voir le message
    (voir CUBE au vu de la demande)
    Je travaille avec MySQL, et sauf erreur de ma part, CUBE n'y existe pas (aurais-je mal placé mon sujet ?)

  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,

    Il faudrait :
    1/ connaitre la structure de vos tables
    2/ connaitre votre SGBD
    3/ idéalement : avoir un jeu d'essai sous forme de CREATE TABLE + INSERT


    La profondeur des hiérarchies est-elle toujours de deux ? (peut-il y avoir des sous-sous département et des sous-sous-catégories ?)

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Par défaut
    Comme mentionné dans mon précédent message, je travaille avec MySQL.

    J'ai quatre tables de base :
    • department
    • person
    • expense
    • expense_type

    Les hiérachies utilisent la représentation intervallaire, et j'ai une colonne qui me donne le niveau de l'élément dans la hiérarchie

    Pour mes calculs avec ROLLUP, j'ai deux tables qui représentent de manière plate la hiérarchie des départements et des types de frais
    • department_flat
    • expense_type_flat

    (Vous retrouverez tout ça dans le fichier SQL joint qui contient aussi un bref jeu de données d'exemple)

    La profondeur des hiérarchies est actuellement limitée à trois pour les départements et à deux pour les types de frais. Seulement, l'affichage doit pouvoir changer : on peut choisir un département qui n'est pas racine, ce qui revient à afficher un sous-arbre avec le nœud choisi comme racine.
    Notons aussi qu'à terme, il y aura plusieurs racines (notamment une qui servira pour des données inclassables, ces données provenant de fichiers CSV).

    Alors qu'il y a des personnes dans les départements de tous niveaux, les types de frais sont actuellement répartis uniquement dans les feuilles.


    Pour ma part, je serais cependant curieux de comprendre le comportement récurrent pour généraliser à N et M niveaux, et aussi dans le cas où les frais sont rattachés à n'importe quel type et pas seulement les types feuille
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    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 : 22 001
    Billets dans le blog
    6
    Par défaut
    le seul moyen d'y parvenir est soit :
    1) de faire une requête récursive
    2) de remodéliser votre arbre sous forme intervallaire et de faire un simple SUM sur les différents intervalles souhaités.
    À me lire : http://sqlpro.developpez.com/cours/s...te-recursives/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    le seul moyen d'y parvenir est soit :
    1) de faire une requête récursive
    2) de remodéliser votre arbre sous forme intervallaire et de faire un simple SUM sur les différents intervalles souhaités.
    Merci SQLpro, je vais regarder les requêtes récursives, ça me fait un bel os à ronger.

    J'ai quelques question cependant sur votre seconde proposition, je ne suis pas sûr d'avoir bien compris.
    Pour ce qui est de re-modéliser mon arbre sous forme intervallaire, vous entendez fusionner les deux que j'utilise en un seul ? Les deux arbres sont actuellement déjà fournis ainsi, mais séparément, et c'est peut-être ce qui me bloque, à savoir comment avoir la somme des sous-arbres de niveau N+1 et plus pour le second arbre, alors que je suis au niveau N.

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

Discussions similaires

  1. Somme sur conditions imbriquée dans une requête
    Par aleximan dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 25/01/2008, 18h05
  2. [Quote] DVP quoté sur Bashfr
    Par Skyounet dans le forum La taverne du Club : Humour et divers
    Réponses: 16
    Dernier message: 26/09/2006, 18h52
  3. Problème sur Request.ServerVariables("QUERY_STRING"
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/03/2005, 11h47

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