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

Linq Discussion :

Regroupage de données + somme des champs


Sujet :

Linq

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 44
    Points
    44
    Par défaut Regroupage de données + somme des champs
    Bonjour à tous,

    N'ayant pas de grandes connaissances en SQL et encore moins en Linq, je rencontre un problème concernant le regroupage de champs et faire la somme de chacun d'entre eux.

    Je m'explique en utilisant un exemple béta, j'ai une table :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    champ1,   champ2,   champ3,   champ4
     
       1           200         300          400
       2           100         500          150
       1           600          50           100
       3           700         375            25
       2           100         500          150
       1           50           100           89

    Je cherche à regrouper les données dont le champ1 est égal à 1 et 3 et faire la somme des autres champs. Donc, prendre les lignes n° 1,3,4,6 et effectuer la somme des champs 2,3,4 répondant aux conditions pour obtenir ce résultat

    champ2 = 1550, champ3 = 825, champ4 = 614

    J'ai donc fait une requête ressemblant à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ...
     
    (from sa in maVue where champ1==1
    || champ1==3
    group sa by champ1 into it
    select new MaStructure
    {
       total1 = it.Sum(p => p.champ2),
       total2 = it.Sum(p => p.champ3),
       total3 = it.Sum(p => p.champ4)
    }
    ).FirstOrDefault();
    ....
    Mais le résultat est erroné Quelqu'un pourrait-il éclairer ma lanterne car je suis un perdu

    Merci d'avance pour vos réponses

    Cordialement

  2. #2
    Membre averti

    Inscrit en
    Septembre 2004
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 105
    Points : 339
    Points
    339
    Par défaut
    Je pense que tu devrais découper ta requête en deux étapes pour la rendre plus lisible et prévisible.

    Il est probable qu'elle retourne plus d'un résultat, donc en utilisant FirstOrDefault(), tu ignore le reste. Normalement, tu aurai du utiliser Single() qui t'aurai signalé ce problème.

  3. #3
    Membre régulier Avatar de Marsupilami_00
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 102
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    la requête te retournera jamais ces valeurs
    le fait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    group sa by champ1 into it
    te regroupera les champs 1 puis les champs 3 et jamais les deux. Il faut un regroupement supérieur qui regroupe le 1 et 3 pour le calcul de l'agrégat sur les deux valeurs.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Marsupilami_00 Voir le message
    Bonjour,

    la requête te retournera jamais ces valeurs
    le fait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    group sa by champ1 into it
    te regroupera les champs 1 puis les champs 3 et jamais les deux. Il faut un regroupement supérieur qui regroupe le 1 et 3 pour le calcul de l'agrégat sur les deux valeurs.
    Bonjour,

    Certes, mais à quoi devrait ressembler cette requête ? Car et comme je l'ai précisé au départ mes connaissances SQL et LINQ sont plus que limitées....

    Merci d'avance

  5. #5
    Membre régulier Avatar de Marsupilami_00
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 102
    Points : 99
    Points
    99
    Par défaut
    Hello,

    N'ayant pas de regroupement supérieur au champ1, il faut faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var req = (from sa in maVue where champ1==1
    || champ1==3
    select new MaStructure
    {
       total1 = it.Sum(p => p.champ2),
       total2 = it.Sum(p => p.champ3),
       total3 = it.Sum(p => p.champ4)
    }
    );
     
    var total1 = req.sum(p => p.total1);
    var total2 = req.sum(p => p.total2);
    var total3 = req.sum(p => p.total3);
    @+

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Merci pour la réponse, cependant je m'attendais, comment dire... à quelque chose de plus succinct, car la structure que j'emploi dans la réalité est autrement plus importante, une quarantaine de champs environ et si je dois procéder de la même manière pour ces derniers je ne suis pas sorti de l'auberge ! N'existe-t-il pas une autre manière plus courte et plus "élégante" que cet exemple pour obtenir un résultat identique ?

    Cordialement

  7. #7
    Membre régulier Avatar de Marsupilami_00
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 102
    Points : 99
    Points
    99
    Par défaut
    Hello,

    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
     
    IList<MaStructure> liste= (from sa in maVue where champ1==1
    || champ1==3
    group sa by champ1 into it
    select new MaStructure
    {
       Id = 1,
       total1 = it.Sum(p => p.champ2),
       total2 = it.Sum(p => p.champ3),
       total3 = it.Sum(p => p.champ4)
    }
    ).ToList();
     
    MaStructure req = (from sa in liste
    group sa by id into it
    select new MaStructure
    {
       Id = it.Key
       total1 = it.Sum(p => p.champ2),
       total2 = it.Sum(p => p.champ3),
       total3 = it.Sum(p => p.champ4)
    }
    ).firstOrDefault();

  8. #8
    Inactif
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Algérie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 59
    Points : 73
    Points
    73
    Par défaut Utilise MultiCast Delegate
    Salut!
    Pour le probleme de groupe et somme, j'ai utilisé les multicast delegates. voici un exemple modifié de mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //La partie linq pour l'execution de la requete sur le code 
    DataTable destTable = new DataTable();
                    destTable.Columns.Add("Group", typeof(System.Int32));
                    destTable.Columns.Add("Total Qte", typeof(System.Double));
     
     
                    var enumer = from tableRow in initTable.AsEnumerable()
                                 group tableRow by tableRow.Field<Int32>("Champs1") into rows
                                 select newRow(destTable,rows);
                    foreach (var value in enumer)
                    {
                        destTable.Rows.Add(value);
                    }

    comme vous pouvez constater l'utilisation de l'extension group by ne suffit pas donc il faut rajouter un multicast delegate qui va générer la somme sur la colonne de votre choix.

    voici l'implementation de newrow():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Func<DataTable, IGrouping<Int32, DataRow>, DataRow> newRow = delegate(DataTable destTable, IGrouping<Int32, DataRow> group)
            {
                DataRow dst = destTable.NewRow();
                dst["Group"] = group.Key;
                dst["Total"] = group.Sum(row => row.Field<double>("Champs2"));
    /// rajouter autant de sommes que vous souhaiter
                return dst;
            };
    donc voila vous aurez à la fin la solution a votre problème. J'espere que c'est une explication claire.
    hope it helps.
    Bon Courage.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 44
    Points
    44
    Par défaut
    Merci pour ces réponses. Je vais tâcher de les mettre au plus vite toutes les deux en applications et je vous tiens au courant d'ici quelques temps.

    Cordialement

Discussions similaires

  1. la somme des champs
    Par petchy dans le forum Access
    Réponses: 9
    Dernier message: 11/12/2006, 10h08
  2. [reporting services] Somme des champs
    Par Wells dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/08/2006, 11h28
  3. rave report (somme des champs par pages)
    Par mozcity dans le forum Composants VCL
    Réponses: 3
    Dernier message: 17/03/2006, 21h51
  4. somme des champs null
    Par s.rais dans le forum Access
    Réponses: 4
    Dernier message: 09/02/2006, 09h05
  5. Somme des champs ? existe t il une fonction ...
    Par dark_vidor dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/01/2006, 11h57

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