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 :

SUM sur des enregistrements consécutifs


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 40
    Points
    40
    Par défaut SUM sur des enregistrements consécutifs
    Bonjour,
    Je souhaite sommer sur une colonne z (SUM(z)) des enregistrements successifs ayant la même valeur de y.
    exemple :

    x y z
    1 b 5
    2 a 8
    3 a 2
    4 f 9
    5 a 20
    Dans cet exemple, je souhaite sommer les 2 eregistrements ayant x (= 2 et 3), possédant la même valeur de y (=a). le résultat de la somme SUM(z) sera 10
    y a-t-il moyen de le faire en des requêtes sql ?
    Merci ..

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Voila déjà un moyen d'identifier les lignes consécutives :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  x, y, z
    FROM    matable tbl
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    matable sui
                WHERE   tbl.y   = sui.y
                    AND tbl.x   IN (sui.x + 1, sui.x - 1)
            )
    ;
    A toi de voir la suite
    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
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 40
    Points
    40
    Par défaut
    merci
    mais cette requête prend un énorme temps d'exécution sachant que j'ai une BD de 80 000 enregistremets !!

  4. #4
    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
    Quel est votre SGBD ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 40
    Points
    40
    Par défaut
    MYSQL

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Y a-t-il des index sur la table ?
    Sur quelles colonnes ou tuples ?
    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.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 40
    Points
    40
    Par défaut
    oui les colonnes w et x sont des indexes de la table
    comme dans l'exemple ci-dessous :
    w x y z
    1 1 ..
    1 2 ..
    1 3 ..
    5 1 ..
    5 2
    7 1
    7 2

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 40
    Points
    40
    Par défaut
    j'arrive pas à intégrer dans cette requête la SUM(z) des enregistrements succéssifs!!
    any help please ??

    Citation Envoyé par al1_24 Voir le message
    Voila déjà un moyen d'identifier les lignes consécutives :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  x, y, z
    FROM    matable tbl
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    matable sui
                WHERE   tbl.y   = sui.y
                    AND tbl.x   IN (sui.x + 1, sui.x - 1)
            )
    ;
    A toi de voir la suite

  9. #9
    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
    Je ne garanti pas les performances sur MySQL, c'est une traduction de ce que j'aurai écrit mais sans fonctions de fenêtrage.

    Jeu de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    insert into MaTable (w, x, y, z)
    select 1, 1, 'b',  5 union all
    select 1, 2, 'a',  8 union all
    select 1, 3, 'a',  2 union all
    select 1, 4, 'f',  9 union all
    select 1, 5, 'a', 20 union all
    select 5, 1, 'b',  5 union all
    select 5, 2, 'a',  8 union all
    select 7, 1, 'b',  5 union all
    select 7, 2, 'a',  8;
    Requête
    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
      select SR1.w, SR1.y
           , sum(SR1.z) as z
        from ( select mt1.w, mt1.x, mt1.y, mt1.z
                    , count(*) as rn
                 from MaTable as mt1
                 join MaTable as mt2
                   on mt2.w  = mt1.w
                  and mt2.x <= mt1.x
             group by mt1.w, mt1.x, mt1.y, mt1.z ) as SR1
        join ( select mt1.w, mt1.x, mt1.y, mt1.z
                    , count(*) as rm
                 from MaTable as mt1
                 join MaTable as mt2
                   on mt2.w  = mt1.w
                  and mt2.y  = mt1.y
                  and mt2.x <= mt1.x
             group by mt1.w, mt1.x, mt1.y, mt1.z ) as SR2
          on SR2.w = SR1.w
         and SR2.x = SR1.x
         and SR2.y = SR1.y
         and SR2.z = SR1.z
    group by SR1.w, SR1.y
           , SR1.rn - SR2.rm
    order by SR1.w, min(SR1.rn);
     
    w           y    z
    ----------- ---- -----------
    1           b    5
    1           a    10
    1           f    9
    1           a    20
    5           b    5
    5           a    8
    7           b    5
    7           a    8

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 40
    Points
    40
    Par défaut
    merci
    pouvez m'expliquer svp l'interet de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP by SR1.rn - SR2.rm
    ??

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 40
    Points
    40
    Par défaut
    merci ce-ci fonctionne bien dans le cas ou (w,x) est la clé primaire de la table
    par contre je voudrai que ça marche dans le cas ou on considère que deux enregistrements sont succéssifs lorsqu'ils ont des valeurs succéssifs de x (dans ce cas (w,x,y) est la clé primaire de la table)
    soit l'exemple :

    Jeu de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    insert into MaTable (w, x, y, z)
    select 1, 1, 'b',  5 union all
    select 1, 2, 'a',  8 union all
    select 1, 2, 'o',  2 union all
    select 1, 3, 'a',  2 union all
    select 1, 4, 'f',  9 union all
    select 1, 5, 'c', 20 union all
    select 5, 0, 'c',  5 union all
    select 5, 2, 'a',  8 union all
    select 7, 1, 'b',  5 union all
    select 7, 2, 'a',  8;
    Requête

    le résultat attendu de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    w           y    z
    ----------- ---- -----------
    1           b    5
    1           a    10
    1           o    2
    1           f    9
    1           a    20
    5           b    5
    5           a    8
    7           b    5
    7           a    8

  12. #12
    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
    C'est exactement ce que renvoie la requête (à part quelques incohérences entre le jeu de départ et d'arrivée), donc je ne comprends pas très bien votre question.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 40
    Points
    40
    Par défaut
    la requête revient dans ce cas de jeux de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    w           y    z
    ----------- ---- -----------
    1           b    5
    1           a    8
    1           o    2
    1           a    2 
    1           f    9
    1           a    20
    5           b    5
    5           a    8
    7           b    5
    7           a    8
    c-a-d qu'elle ne considère pas que les enregistremets 2 et 4 du jeux de données ont des valeurs succéssifs du champs x !!

    Citation Envoyé par Waldar Voir le message
    C'est exactement ce que renvoie la requête (à part quelques incohérences entre le jeu de départ et d'arrivée), donc je ne comprends pas très bien votre question.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/05/2006, 20h30
  2. [WD9] Cliquer sur des enregistrements dans une table
    Par oz80 dans le forum WinDev
    Réponses: 2
    Dernier message: 15/12/2005, 20h11
  3. Réponses: 1
    Dernier message: 12/12/2005, 16h11
  4. Calcul de données present sur des enregistrements different
    Par logistik dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/05/2005, 16h33
  5. Réponses: 8
    Dernier message: 24/08/2004, 22h25

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