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 :

Faire un tableau de sommes par deux critères et par jour


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 147
    Points : 53
    Points
    53
    Par défaut Faire un tableau de sommes par deux critères et par jour
    Bonjour,

    Je ne sais pas si c'est possible de faire en sql ce que je vais demander
    Ca paraît simple là encore, mais je n'y arrive pas

    J'ai une table t1 qui contient les champs :
    - date : une date sous le format classique
    - duree : un temps en minutes
    - qui : peut prendre plusieurs valeurs selon les personnes enregistrées
    - quoi : peut prendre deux valeurs : A ou B

    Je voudrai obtenir un tableau de la forme suivante
    date qui1_quoiA qui1_quoiB quiX_quoiA quiX_quoiB total quoiA total quoiB total A+B
    jour1 sum(duree) sum(duree) sum(duree) sum(duree) sum(duree) sum(duree) sum(duree)
    jour2 sum(duree) sum(duree) sum(duree) sum(duree) sum(duree) sum(duree) sum(duree)
    avec sum(duree) en heures et minutes

    J'ai testé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT  distinct  date, qui,  quoi, date_format(sec_to_time(SUM(duree)*60), '%H:%i')
    FROM t1
    GROUP BY date, qui, quoi
    Ca ne donne pas le résultat escompté mais cette forme :


    date qui comment total
    jour1 vide quoiA total quoiA
    jour1 vide quoiB total quoiB
    jour1 qui1 quoiA total quoiA
    jour1 qui1 quoiB total quoiB
    jour1 quix quoiA total quoiA
    jour1 quix quoiB total quoiB

    ... et la même chose pour les jours suivants

    J'arrive donc presque à récupérer toutes les informations, mais je n'arrive pas à les présenter comme je veux ...
    Y a t il une solution ?

    Merci d'avance pour votre aide.

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

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

    Informations forums :
    Inscription : mai 2002
    Messages : 8 914
    Points : 29 804
    Points
    29 804
    Par défaut
    Bonjour,

    Si ton SGBD le prend en charge, il faudrait que tu regardes du côté de l'opérateur PIVOT.
    Si le nombre de colonnes (nombre de QUI) n'est pas connu à l'avance, il faudra créer la requête de manière dynamique.
    Dans ce cas, il peut être aussi intéressant de gérer la mise en forme du tableau au niveau de l'application qui interroge la base de données.
    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
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    bonjour
    Merci pour cette réponse rapide
    Je travaille sous mariadb (mysql)
    je vais voir cette fonction PIVOT que je ne connais pas
    En ce qui concerne le nombre de qui, il est effectivement variable selon les jours
    Justement je traite actuellement cet état avec plusieurs requêtes dans l'application et c'est assez long.
    J'essayais de rendre cela plus rapide.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    PIVOT ne semble pas exister sous mariadb
    En ce qui concerne les qui variables, je peux faire d'abord une sélection par ce genre de requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT DISTINCT qui
    FROM t1
    WHERE
    (qui<>'') and
     (date>=x) AND (v_date<=y);
    mais je ne sais pas si je peux imbriquer les deux ...?

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    7 667
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 667
    Points : 18 088
    Points
    18 088
    Par défaut
    bonjour effectivement ça semble être simple à concevoir mais compliqué en SQL.
    Avec des jointures LEFT,RIGHT JOIN avez-vous étudié le problème ?
    Si c'est trop compliqué je pense qu'il faut utiliser des curseurs

    La démarche est la suivante: boucler sur chaque date et pour une date en particulier calculer les sommes requises.
    Le gros avantage des curseurs/procédures stockées c'est qu'on peut utiliser des conditions logiques avec des if then.
    Plutôt que de faire une requête SQL imbriquée et compliquée.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    Merci, effectivement tout cela a l'air compliqué alors que je croyais que c'était un truc simple à faire en sql ... comme quoi ..

    J'ai finalement opté pour une requête un peu plus sophistiqué que les multiples requêtes que je faisais par programme .
    Elle me donne le résultat donné au début du post mais sans les cases vides pour qui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT  distinct  date, qui, quoi, date_format(sec_to_time(SUM(duree)*60), '%H:%i') AS total
    FROM t1
    WHERE (quoi='A') AND (v_date>='xxxx-xx-xx') AND (v_date<='yyyy-yy-yy') 
    GROUP BY date, qui, quoi
    x et y sont bien sûr des dates au bon format

    Finalement je retraite le résultat dans le programme en faisant une ligne jusqu'à ce que je détecte un changement de date ..
    Un peu bourrin comme méthode, mais j'ai déjà divisé le temps de traitement de la requête par 10 !

    merci

Discussions similaires

  1. [XL-2007] Somme selon deux critères
    Par Aal'k dans le forum Excel
    Réponses: 4
    Dernier message: 21/06/2016, 18h04
  2. [SP-2010] Faire un tableau synthèse "total par budget"
    Par MrMeteo dans le forum SharePoint
    Réponses: 16
    Dernier message: 02/02/2015, 15h00
  3. [XL-2003] Somme suivant deux critères
    Par pouldom dans le forum Excel
    Réponses: 12
    Dernier message: 15/12/2011, 08h24
  4. Réponses: 4
    Dernier message: 08/12/2011, 14h39
  5. [XL-2003] Somme selon deux critères
    Par arnest dans le forum Excel
    Réponses: 1
    Dernier message: 13/01/2010, 10h07

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