1
votes

Comment trouver la moyenne lorsque les instances sont regroupées ou catégorisées sur plusieurs colonnes?

Il y a un tableau "Résultat" avec les données suivantes:

Title   SubCategory   AvgValue
Part-1  A          100
Part-1  B          0
Part-1  C          75
Part-2  A          40
Part-2  B          10
Part-2  C          90

Et voici ce que j'essaie de réaliser:

ID   Title   Category  SubCategory  Value
1    Part-1  CatX      A            100
2    Part-1  CatX      B            0
3    Part-1  CatX      C            50
4    Part-1  CatY      A            100
5    Part-1  CatY      B            0
6    Part-1  CatY      C            100
7    Part-2  CatM      A            30
8    Part-2  CatM      B            10
9    Part-2  CatM      C            100
10   Part-2  CatN      A            50
11   Part-2  CatN      B            10
12   Part-2  CatN      C            80

Chaque titre a 3 sous-catégories et je dois afficher la valeur moyenne de chaque sous-catégorie pour chaque titre. Veuillez aider. La réponse peut être une requête de serveur SQL ou Linq car je peux obtenir la table de résultats dans une liste / datatable.


0 commentaires

4 Réponses :


4
votes

Utilisez la fonction d'agrégation avg ()

  select Title,SubCategory ,avg(Value) 
  from table_name 
  group by Title,SubCategory 


0 commentaires

3
votes

Cela fonctionnerait

select Title, SubCategory, AVG(Value)
from Table1 
group by Title, subcategory


0 commentaires

2
votes

Voici la solution:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication97
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Title", typeof(string));
            dt.Columns.Add("Category", typeof(string));
            dt.Columns.Add("SubCategory", typeof(string));
            dt.Columns.Add("Value", typeof(int));

            dt.Rows.Add(new object[] {1, "Part-1", "CatX", "A", 100});
            dt.Rows.Add(new object[] {2, "Part-1", "CatX", "B", 0});
            dt.Rows.Add(new object[] {3, "Part-1", "CatX", "C", 50});
            dt.Rows.Add(new object[] {4, "Part-1", "CatY", "A", 100});
            dt.Rows.Add(new object[] {5, "Part-1", "CatY", "B", 0});
            dt.Rows.Add(new object[] {6, "Part-1", "CatY", "C", 100});
            dt.Rows.Add(new object[] {7, "Part-2", "CatM", "A", 30});
            dt.Rows.Add(new object[] {8, "Part-2", "CatM", "B", 10});
            dt.Rows.Add(new object[] {9, "Part-2", "CatM", "C", 100});
            dt.Rows.Add(new object[] {10, "Part-2", "CatN", "A", 50});
            dt.Rows.Add(new object[] {11, "Part-2", "CatN", "B", 10});
            dt.Rows.Add(new object[] {12, "Part-2", "CatN", "C", 80});

            var groups = dt.AsEnumerable().GroupBy(x => new { title = x.Field<string>("Title"), subcategory = x.Field<string>("SubCategory") }).ToList();

            var totals = groups.Select(x => new {title = x.Key.title, subCategory = x.Key.subcategory, average = x.Average(y => y.Field<int>("Value"))}).ToList();

        }
    }


}


2 commentaires

Merci beaucoup. ! Est-ce plus rapide que les procédures stockées lorsque les données sont volumineuses?


Lors de la comparaison de la vitesse entre les procédures stockées et c #, il y a 3 facteurs 1) La quantité de données transférée entre le serveur SQL et l'application c #. 2) L'heure d'obtention des données de la base de données qui est la même dans les deux cas. 3) Le temps de regroupement et de calcul de la moyenne qui dépend de la vitesse du serveur SQL par rapport à la vitesse de la machine locale. Le serveur pourrait être sur la machine locale et alors il est probablement très similaire. Dans votre cas, vous avez une grande quantité de données, donc c'est probablement plus rapide dans une procédure stockée.



2
votes

Vous pouvez également essayer une autre approche comme indiqué ci-dessous.

Create Table Result(Id int, Title Varchar(10), Category Varchar(10), SubCategory Varchar(10), Value Int)
Insert Into Result Values(1, 'Part-1','CatX',      'A',            100),
(2    ,'Part-1','CatX',      'B',            0),
(3    ,'Part-1','CatX',      'C',            50),
(4    ,'Part-1','CatY',      'A',            100),
(5    ,'Part-1','CatY',      'B',            0),
(6    ,'Part-1','CatY',      'C',            100),
(7    ,'Part-2','CatM',      'A',            30),
(8    ,'Part-2','CatM',      'B',            10),
(9    ,'Part-2','CatM',      'C',            100),
(10   ,'Part-2','CatN',      'A',            50),
(11   ,'Part-2','CatN',      'B',            10),
(12   ,'Part-2','CatN',      'C',            80)

Select Title, SubCategory, AVG(Value) as Average from Result
Group By Title, SubCategory

Select Title, SubCategory, SUM(Value) / COUNT(*) as Average
From Result Group By Title, SubCategory

La sortie dans les deux cas est celle ci-dessous, qui sont identiques.

entrer l'image description here

Vous pouvez trouver la démo en direct Démo en direct ici


0 commentaires