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 :

Parcourir une vue et faire la somme de quelques colonnes avec CONDITION [MySQL-5.6]


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2021
    Messages : 33
    Par défaut Parcourir une vue et faire la somme de quelques colonnes avec CONDITION
    Bonjour,
    je travaille toujours avec des données de type TIME dans ma table où je calcule les durées et les écarts,et je dois à chaque fois faire des calculs avec des CONDITONS.
    dans l'image ci dessous un 1er cas c'est un résultat d'une vue sur ma table.

    Nom : Somme_cas1.png
Affichages : 232
Taille : 53,2 Ko

    La requête que je dois faire est un peu complexe pour moi:
    Si mon écart = '00:00:01', je fais la somme de( Durée + Durée -1 )+ ecart => (00:01:36+00:05:28) + 00:00:01 =0:07:05
    comme indiqué dans le cadre rouge, ET rassembler les deux lignes en une seule ligne , en fait c'est une ligne qui a été découpé sur 2 pour des effectuer d'autres calculs afin de répondre à d'autres besoins, mais là je sais pas si c'est possible de les regrouper en une seule ligne comme le résultat du tableau souligné ci-dessous :

    debut fin Somme_Duree
    10:54:31 11:01:36 00:07:05


    une 2eme cas dans la même VUE, une ligne découpé sur 3, => (00:49:08+00:59:59+00:08:19) + 00:00:01+ 00:00:01 =01:57:28
    Nom : Somme_cas2.png
Affichages : 222
Taille : 104,4 Ko
    debut fin Somme_Duree
    14:10:51 16:08:19 01:57:28



    Est ce que j'ai besoin de créer une autre table où je stocke les nouvelles lignes regroupées?

    Est ce j'ai besoin d'un curseur pour parcourir ma vue?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 639
    Billets dans le blog
    10
    Par défaut
    Bonsoir Mawa 31

    Ca ressemble fort au sujet précédent ICI, la solution est donc probablement très proche

    Toutefois, avant de chercher plus loin :
    - on a à nouveau un écart qui ne correspond pas à heurefin - heuredébut, que faut il en penser ?
    - s'il n'y aucune autre donnée dans la table, comment savoir ce qu'il faut réellement sommer ou pas, peut être que dans certains cas l'écart de 1 seconde seulement, concerne quelque chose qui n'a rien à voir avec la ligne qui précède

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2021
    Messages : 33
    Par défaut
    Bonsoir escartefigue,
    - on a à nouveau un écart qui ne correspond pas à heurefin - heuredébut, que faut il en penser ?
    => l"ecart dans cette vue c'est le [B](debut - heure fin - 1) = 11:00:00 - 10:59:59 = 00:00:01[/B]
    - s'il n'y aucune autre donnée dans la table, comment savoir ce qu'il faut réellement sommer ou pas, peut être que dans certains cas l'écart de 1 seconde seulement, concerne quelque chose qui n'a rien à voir avec la ligne qui précède
    => toute les durées ont la même information (Type de communication), et une date , donc moi je veux sommer les lignes de la même date avec l écart entre eux de 00:00:01.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 639
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Voici :

    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
    with tab0 (dte, hdeb, hfin, ecart) as
        (select '2021-01-11', '14:09:14', '14:09:32', '01:07:58'   union all
         select '2021-01-12', '14:10:51', '14:59:59', '00:01:19'   union all
         select '2021-01-12', '15:00:00', '15:59:59', '00:00:01'   union all
         select '2021-01-12', '16:00:00', '16:08:19', '00:00:01'   union all
         select '2021-01-12', '16:10:27', '16:10:41', '00:02:08'   union all
         select '2021-01-13', '17:02:37', '17:02:55', '00:00:01'
        )
       , tab1 (dte, hdeb, hfin, ecart, duree, maxfin) as
        (select T0.dte
              , T0.hdeb
              , T0.hfin
              , timediff(T0.hfin, T0.hdeb)
              , T0.ecart
              , coalesce(T1.hfin, T0.hfin) 
              from tab0  T0     
              left join tab0 T1
                 on T1.dte  = T0.dte
                and T1.hfin =
                   (select max(hfin)
                    from tab0 
                    where dte=T0.dte
                      and hfin > T0.hfin
                      and ecart='00:00:01'
                   )
        )
    select dte
         , min(hdeb)
         , max(hfin)
         , cast(sum(cast(duree as time)) as time)
    from tab1    
    group by dte, maxfin

    Résultat :
    dte min(hdeb) max(hfin) cast()
    2021-01-11 14:09:14 14:09:32 01:07:58
    2021-01-12 14:10:51 16:08:19 00:01:21
    2021-01-12 16:10:27 16:10:41 00:02:08
    2021-01-13 17:02:37 17:02:55 00:00:01

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2021
    Messages : 33
    Par défaut
    Bonjour escartefigue,
    merci infiniment pour votre aide, là je viens d'appliquer le code sur ma vue et changer un peu selon mes champs biensur.
    il m'affiche un message d'erreur : Unknown Column'T1.fin' .
    Ci dessous le code que j'essaye d'executer:

    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
    with tab0 (Chaine,DATE_DIFF, debut, fin, ecart) as
        (SELECT 'k6','2021-01-11', '14:09:14', '14:09:32', '01:07:58'   union all
         SELECT 'T1','2021-01-12', '14:10:51', '14:59:59', '00:01:19'   union all
         SELECT 'T1','2021-01-12', '15:00:00', '15:59:59', '00:00:01'   union all
         SELECT 'T1','2021-01-12', '16:00:00', '16:08:19', '00:00:01'   union all
         SELECT 'T1','2021-01-12', '16:10:27', '16:10:41', '00:02:08'   union all
         SELECT 'T1','2021-01-13', '17:02:37', '17:02:55', '00:00:01'
        )
       , tab1 (Chaine,DATE_DIFF, debut, fin, ecart, duree, maxfin) as
        (SELECT T0.Chaine
    	 	    , T0.DATE_DIFF
              , T0.debut
              , T0.fin
              , timediff(T0.fin, T0.debut)
              , T0.ecart
              , COALESCE(T1.fin, T0.fin) 
              from tab0 T0 , tab0 T1    
              where
                 T1.DATE_DIFF = T0.DATE_DIFF AND T1.Chaine = T0.Chaine
                and T1.fin =
                   (select max(fin)
                    from tab0 
                    where dte=T0.DATE_DIFF
                      and fin > T0.fin
                      and ecart='00:00:01'
                   )
        )
    SELECT Chaine
         , DATE_DIFF
         , min(debut)
         , max(fin)
         , cast(sum(cast(duree as time)) as time)
    from tab1    
    group BY Chaine, DATE_DIFF, maxfin

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 639
    Billets dans le blog
    10
    Par défaut
    il y avait plusieurs coquilles dans votre requête
    La première est d'avoir codé la jointure dans le WHERE, non seulement c'est une syntaxe obsolète, mais surtout, ça implique une jointure INNER alors qu'il faut une jointure OUTER comme je l'avais codé plus haut
    Il y avait aussi quelques erreurs de syntaxe.

    Aussi, c'est une mauvaise idée d'appeler une colonne DATE_DIFF pour y stocker des dates : ça porte confusion avec la fonction DATEDIFF() de calcul d'écart entre deux dates. Le choix des noms de colonnes n'est pas neutre, ça participe à la lisibilité de la requête (pensez aux maintenances futures )

    c'est corrigé ci-dessous :

    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
    36
    with tab0 (Chaine, DATE_DIFF, debut, fin, ecart) as
        (SELECT 'k6','2021-01-11', '14:09:14', '14:09:32', '01:07:58'   union all
         SELECT 'T1','2021-01-12', '14:10:51', '14:59:59', '00:01:19'   union all
         SELECT 'T1','2021-01-12', '15:00:00', '15:59:59', '00:00:01'   union all
         SELECT 'T1','2021-01-12', '16:00:00', '16:08:19', '00:00:01'   union all
         SELECT 'T1','2021-01-12', '16:10:27', '16:10:41', '00:02:08'   union all
         SELECT 'T1','2021-01-13', '17:02:37', '17:02:55', '00:00:01'
        )
       , tab1 (Chaine, DATE_DIFF, debut, fin, ecart, duree, maxfin) as
        (SELECT T0.Chaine
              , T0.DATE_DIFF
              , T0.debut
              , T0.fin
              , timediff(T0.fin, T0.debut)
              , T0.ecart
              , COALESCE(T1.fin, T0.fin) 
              from tab0 T0 
              left join tab0 T1    
                on  T1.Chaine    = T0.Chaine
                and T1.DATE_DIFF = T0.DATE_DIFF 
                and T1.fin =
                   (select max(fin)
                    from tab0 
                    where chaine=T0.chaine
                      and DATE_DIFF=T0.DATE_DIFF
                      and fin > T0.fin
                      and ecart='00:00:01'
                   )
        )
    SELECT Chaine
         , DATE_DIFF
         , min(debut)
         , max(fin)
         , cast(sum(cast(duree as time)) as time) as kast
    from tab1    
    group BY Chaine, DATE_DIFF, maxfin

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/05/2014, 13h48
  2. Sommes sur 2 colonnes avec conditions
    Par Trady dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/03/2014, 12h06
  3. Réponses: 3
    Dernier message: 30/01/2013, 14h38
  4. Faire la somme de la colonne montant
    Par mathurine dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 09/02/2011, 11h37
  5. comment faire la somme de variable récupérer avec c:set
    Par fakhita dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 20/07/2007, 14h58

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