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 :

Cumul avec group by


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 41
    Points : 28
    Points
    28
    Par défaut Cumul avec group by
    Bonjour,
    Tout allait pour le mieux dans le meilleur des mondes quand je me suis rendu compte de résultat que je n'arrive pas a m'explique dans les colonnes 'nbj_co' et 'te'
    Le but de la colonne 'nbj_co' était de faire le même calcul que la colonne 'nbj' raté

    le but de la colonne 'te' était de cumuler un temps journalier 'motidur' sur la période entre 'dtdeb' et 'dtfin' encore raté

    J’ai fait différents essais avec 'OVER' toujours raté

    J’ai fait des recherches (certainement mal faites) mais toujours raté

    Alors
    Une idée, une piste, un lien qui m’expliquerait ma stupidité, je prends tout.
    Encore merci pour votre temps.
    Cordialement.



    Code sql : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    SELECT  deb.matri
        , deb.dat AS dtdeb 
        , MIN(fin.dat)AS dtfin
        , deb.motif,(MIN(fin.dat)- deb.dat )+1 as nbj
        , count(*)    as nbj_co
        , extract(MONTH from deb.dat)  as m
        , extract(year from deb.dat) as y
        , sum (deb.motidur) as te
        , ROW_NUMBER()over(partition by deb.motif order by deb.matri,deb.dat,deb.motif ) as  rmu
        , CASE
    --WHEN (MIN(fin.dat)- deb.dat )+1  >= 1 AND  (MIN(fin.dat)- deb.dat )+1  <= 3 then 'MI'
           WHEN (MIN(fin.dat)- deb.dat )+1  between 1 and 3 then 'MI'
           WHEN (MIN(fin.dat)- deb.dat )+1  between 4 and 7  then 'C'
           WHEN (MIN(fin.dat)- deb.dat )+1  between 8 and 180  then 'MO'
           WHEN (MIN(fin.dat)- deb.dat )+1  > 180  then 'LO'
           END AS rr 
    FROM    hophabs  deb      
         INNER JOIN          
           hophabs fin          
           ON  deb.matri   = fin.matri          
           AND deb.motif   = fin.motif          
           AND deb.dat    <= fin.dat  
           --and extract(year from deb.dat) = extract(year from fin.dat )   
    WHERE    
    NOT EXISTS          
       (SELECT  NULL              
       FROM    hophabs pre             
       WHERE   deb.matri   = pre.matri                 
               AND deb.motif   = pre.motif                 
               AND deb.dat    = pre.dat  + 1 
               --and extract(year from deb.dat) = extract(year from pre.dat )
       )      
       AND NOT EXISTS          
         (SELECT  NULL              
         FROM    hophabs sui             
         WHERE   fin.matri   = sui.matri                  
                 AND fin.motif   = sui.motif                 
                 AND fin.dat    = sui.dat  - 1  
                 --and extract(year from fin.dat) = extract(year from sui.dat )
       )   
    and deb.motype = 'A'  
    and deb.valoris = 'J'
    and deb.motif IN ( 'MALA' ,'CP') 
    and deb.matri betWeen '00000005'  and  '00000010'
    --and extract(year from deb.dat) = '2012'
    GROUP BY 
    	 deb.matri 
    	,deb.dat
        ,deb.motif
    	,deb.motidur
    ORDER BY deb.matri,deb.dat

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    au vue de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FROM    hophabs  deb      
         INNER JOIN          
           hophabs fin          
           ON  deb.matri   = fin.matri          
           AND deb.motif   = fin.motif          
           AND deb.dat    <= fin.dat
    Je suppose qu'en sorti votre jointure peut dédoubler certaine ligne.

    Donc je vous propose de reprendre la requête, en indiquant la structure de vos deux tables, votre besoin clairement expliqué et de donner un petit jeu d'essai en entrée / sortie de votre process.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Bonjour,

    au vue de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FROM    hophabs  deb      
         INNER JOIN          
           hophabs fin          
           ON  deb.matri   = fin.matri          
           AND deb.motif   = fin.motif          
           AND deb.dat    <= fin.dat
    Je suppose qu'en sorti votre jointure peut dédoubler certaine ligne.

    Donc je vous propose de reprendre la requête, en indiquant la structure de vos deux tables, votre besoin clairement expliqué et de donner un petit jeu d'essai en entrée / sortie de votre process.
    Bonjour
    merci pour votre réponse
    je pense avoir fourni en pièce jointes les éléments .
    le fichier hophabs est un jeux de test
    le fichier résultat est le retour actuel
    le fichier est la structure de la table hophabs
    le but est de reconstituer des période d'absences à partir d'une table qui enregistre un détail a la journée.
    le résultat des colonnes 'NBJ_CO' et 'TE' ne sont pas cohérent avec la période reconstitué. je devrais en théorie pour 'NBJ_CO' avoir la même valeur que 'NBJ'
    par contre les colonnes 'NBJ_CO' et 'TE' hormis leurs valeurs , sont cohérentes entre elles.
    ce que je ne comprend pas, c'est en fait comment j'arrive à ce résultat.

    encore merci pour votre temps
    Fichiers attachés Fichiers attachés

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    Merci pour la structure + jeu de donnée.

    Par contre je ne comprend toujours pas ce que vous cherchez à ressortir.

    le but est de reconstituer des période d'absences à partir d'une table qui enregistre un détail a la journée.
    Une période de jour consécutif pour le même motif d'absence ?



    Par rapport à votre jeu d'essai indiquez le résultat que vous souhaiteriez avoir.


    Edit : ok, je n'avais pas vu l'historique de l'autre conversation.

    Prenez la requête à Waldar et vous aurez vos résultats directement.
    Il faudra juste adapter les clause partition by pour y inclure les matricules.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Si tu veux comprendre pourquoi ton COUNT et ton SUM ne fonctionnent pas, ajoute fin.dat au GROUP BY et remplace MIN(fin.dat) par fin.dat dans le SELECT. Tu verras alors que ton SUM et ton COUNT "travaillent" sur des données qui ne sont pas celles que tu souhaites.

    Tu pourrais faire un truc de ce genre, mais c'est vraiment pas optimisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
        , deb.motif,(MIN(fin.dat)- deb.dat )+1 AS nbj
        , (SELECT count(*)   FROM hophabs tmp WHERE deb.matri=tmp.matri AND tmp.dat >= deb.dat AND tmp.dat <= MIN(fin.dat) AND blah blah ) AS nbj_co
        , extract(MONTH FROM deb.dat)  AS m
        , extract(year FROM deb.dat) AS y
        , (SELECT SUM(tmp.motidur) FROM hophabs tmp WHERE deb.matri=tmp.matri AND tmp.dat >= deb.dat AND tmp.dat <= MIN(fin.dat) AND blah blah ) AS te
        , ROW_NUMBER()over(partition BY deb.motif ORDER BY deb.matri,deb.dat,deb.motif ) AS  rmu
     
    ...
    Et tu devrais supprimer deb.motidur du GROUP BY

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    merci pour la réponse je vais tester
    mais comment savoir la réaction d'un ou d'un sum dans ce cas de figure ?
    il y a des règles ?
    encore merci pour votre aide .
    A+

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Bonjour,


    Merci pour la structure + jeu de donnée.

    Par contre je ne comprend toujours pas ce que vous cherchez à ressortir.



    Une période de jour consécutif pour le même motif d'absence ?



    Par rapport à votre jeu d'essai indiquez le résultat que vous souhaiteriez avoir.


    Edit : ok, je n'avais pas vu l'historique de l'autre conversation.

    Prenez la requête à Waldar et vous aurez vos résultats directement.
    Il faudra juste adapter les clause partition by pour y inclure les matricules.
    Merci pour votre aide et conseil

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Un sum / count fonctionne tout le temps de la même manière.

    Prenez un exemple simple pour comprendre son fonctionnement.

    Par exemple une table de vente simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    No_Article              Px_Vente
    ----------------------------------
    1                          10
    1                          15
    1                          5
    2                          8

    Puis faites une requete simple aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select No_Article, sum(Px_Vente), count(*)
    from Ma_Table
    GROUP BY No_Article

    Une fois ceci compris, vous pouvez enlever la clause group by de votre requête pour voir sur quoi l'agrégation va porter.


    Sinon je ne suis pas pour l'utilisation de la requête de Fred_34... repartez de la requête de Waldar qui fait ce que vous demandez..

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    mon problème dans la solution de Waldar c'est que le résultat n'est pas correct .
    j'ai fait des tests en rajoutant des clauses partition mais sans succès
    je vais continuer à creuser

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Effectivement.

    J'ai pas trouvé mieux que du récursif, non applicable en l'état à MySql.

    Vous devriez trouvez une solution qui s'en approche avec certaine spécifité de MySql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    with recursive tmp (matri, datDeb, datFin, motif, motidur) as (
    select matri, dat, dat, motif, motidur
    from hophabs a
    where not exists (select null from hophabs b where a.matri = b.matri and a.motif = b.motif and a.dat - 1 = b.dat)
    union all
    select b.matri, a.datDeb, b.dat, b.motif, b.motidur
    from tmp a
    inner join hophabs b on a.matri = b.matri and a.motif = b.motif and a.datFin + 1 = b.dat)
     
    select matri, datDeb, max(datFin), motif, sum(motidur), count(*) as nbJour
    from tmp
    group by matri, datDeb, motif
    order by matri, datDeb
    Ceci étant dit j'ai l'impression de loupé un truc, l'approche de Waldar me plait bien, mais j'ai pas le temps de creuser aujourd'hui.

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par eryck Voir le message
    mon problème dans la solution de Waldar c'est que le résultat n'est pas correct.
    Le résultat de ma requête est parfaitement correct.

Discussions similaires

  1. selection avec group by mais ne garder que ...
    Par Larson dans le forum Langage SQL
    Réponses: 13
    Dernier message: 22/06/2005, 17h23
  2. [débutant] problème avec Group by
    Par Amenofis dans le forum Débuter
    Réponses: 5
    Dernier message: 25/05/2005, 09h57
  3. Prb. avec group by
    Par bianconeri dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2005, 14h01
  4. requête avec group by
    Par Staron dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/11/2004, 16h30
  5. update avec group by
    Par slc dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/10/2004, 13h44

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