Как найти среднее значение, когда экземпляры группируются или классифицируются по нескольким столбцам? - PullRequest
0 голосов
/ 17 января 2019

Существует таблица «Результат» со следующими данными:

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

И вот чего я пытаюсь достичь:

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

Каждый заголовок имеет 3 подкатегории, и мне нужно отобразить среднее значение каждой подкатегории для каждого заголовка. Пожалуйста помоги. Ответом может быть запрос SQL-сервера или Linq, поскольку я могу получить таблицу результатов в виде списка / данных.

Ответы [ 4 ]

0 голосов
/ 17 января 2019

Вы также можете попробовать другой подход, как показано ниже.

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

Вывод в обоих случаях аналогичен приведенному ниже.

enter image description here

Вы можете найти живую демонстрацию Демонстрацию здесь

0 голосов
/ 17 января 2019

Это будет работать

select Title, SubCategory, AVG(Value)
from Table1 
group by Title, subcategory
0 голосов
/ 17 января 2019

Вот решение:

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();

        }
    }


}
0 голосов
/ 17 января 2019

Использование avg() агрегатная функция

  select Title,SubCategory ,avg(Value) 
  from table_name 
  group by Title,SubCategory 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...