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.
4 Réponses :
Utilisez la fonction d'agrégation avg ()
select Title,SubCategory ,avg(Value) from table_name group by Title,SubCategory
Cela fonctionnerait
select Title, SubCategory, AVG(Value) from Table1 group by Title, subcategory
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();
}
}
}
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.
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.
Vous pouvez trouver la démo en direct Démo en direct ici