使用 LINQ 对其进行平均分组 SQL
Grouping with an average of it using LINQ to SQL
我有一个正在编写的 c# 程序,其中有人输入一整天的生产,我计算机器使用率 (MU),如下所示:
Date | Part Number | Mold Num | Machine Num | MU
2/12/2016 | 1185-5B8 | 6580 | 12 | .428
2/12/2016 | 2249300 | 7797 | 36 | .271
2/12/2016 | 146865 | 5096789 | 12 | .260
2/16/2016 | 123456 | 7787 | 56 | .354
2/16/2016 | 123456 | 787 | 54 | .45
2/16/2016 | 123456 | 777 | 56 | .799
2/16/2016 | 123456 | 87 | 54 | .611
我如何将所有相同 table 的数据分组,如下所示:
2/12/2016 2/16/2016
Machine Num. | MU Machine Num. | MU
12 | 34.4% 54 | 53.0%
36 | 27.1% 56 | 57.6%
一切都在table的地方叫做[MU Report]
编辑:
MU = 时间 运行 / 可用时间。所以我所做的是为每个单独的条目计算 MU,以便稍后取平均值。
由于平均值仅基于 天 并且分组基于 日期和机器编号 ,您需要级别分组:
一个。计算每天的总计。
b。根据以上总数计算每台机器每天的平均值
var dailyTotals = sampleData.GroupBy(x => x.Date)
.ToLookup(x => x.Key, x => x.Sum(y => y.MU));
var groupedData = (from m in sampleData
group m by new { m.Date, m.MachineNum } into grp
let dailyTotal = dailyTotals[grp.Key.Date].FirstOrDefault()
let dailyMachineTotal = grp.Sum(x => x.MU)
select new
{
Date = grp.Key.Date,
MachineNumber = grp.Key.MachineNum,
MU = (dailyMachineTotal / dailyTotal) * 100
}).ToList();
Class(样本):
public class MachineData
{
public DateTime Date { get; set; }
public string PartNumber { get; set; }
public int MoldNum { get; set; }
public int MachineNum { get; set; }
public decimal MU { get; set; }
}
查询:
var query =
dbItems
.GroupBy(x => new { x.Date, x.MachineNum })
.Select(x => new
{
Date = x.Key.Date,
MachineNum = x.Key.MachineNum,
AverageMU = x.Average(i => i.MU * 100)
})
.ToList();
GroupBy(x => new { x.Date, x.MachineNum })
在这里您可以按日期和机器编号对所有项目进行分组
.Select(x => new
{
Date = x.Key.Date,
MachineNum = x.Key.MachineNum,
AverageMU = x.Average(i => i.MU * 100)
// Instead of x.Average you may used other functions like: Count, Any etc.
})
以下 Select
将创建一个匿名类型,其中将包含:Date
、MachineNum
和 MU * 100
的平均值以获得百分比。
PS:我使用 lambda 而不是纯 LINQ,因为我不太喜欢使用 LINQ
我有一个正在编写的 c# 程序,其中有人输入一整天的生产,我计算机器使用率 (MU),如下所示:
Date | Part Number | Mold Num | Machine Num | MU
2/12/2016 | 1185-5B8 | 6580 | 12 | .428
2/12/2016 | 2249300 | 7797 | 36 | .271
2/12/2016 | 146865 | 5096789 | 12 | .260
2/16/2016 | 123456 | 7787 | 56 | .354
2/16/2016 | 123456 | 787 | 54 | .45
2/16/2016 | 123456 | 777 | 56 | .799
2/16/2016 | 123456 | 87 | 54 | .611
我如何将所有相同 table 的数据分组,如下所示:
2/12/2016 2/16/2016
Machine Num. | MU Machine Num. | MU
12 | 34.4% 54 | 53.0%
36 | 27.1% 56 | 57.6%
一切都在table的地方叫做[MU Report]
编辑:
MU = 时间 运行 / 可用时间。所以我所做的是为每个单独的条目计算 MU,以便稍后取平均值。
由于平均值仅基于 天 并且分组基于 日期和机器编号 ,您需要级别分组:
一个。计算每天的总计。
b。根据以上总数计算每台机器每天的平均值
var dailyTotals = sampleData.GroupBy(x => x.Date)
.ToLookup(x => x.Key, x => x.Sum(y => y.MU));
var groupedData = (from m in sampleData
group m by new { m.Date, m.MachineNum } into grp
let dailyTotal = dailyTotals[grp.Key.Date].FirstOrDefault()
let dailyMachineTotal = grp.Sum(x => x.MU)
select new
{
Date = grp.Key.Date,
MachineNumber = grp.Key.MachineNum,
MU = (dailyMachineTotal / dailyTotal) * 100
}).ToList();
Class(样本):
public class MachineData
{
public DateTime Date { get; set; }
public string PartNumber { get; set; }
public int MoldNum { get; set; }
public int MachineNum { get; set; }
public decimal MU { get; set; }
}
查询:
var query =
dbItems
.GroupBy(x => new { x.Date, x.MachineNum })
.Select(x => new
{
Date = x.Key.Date,
MachineNum = x.Key.MachineNum,
AverageMU = x.Average(i => i.MU * 100)
})
.ToList();
GroupBy(x => new { x.Date, x.MachineNum })
在这里您可以按日期和机器编号对所有项目进行分组
.Select(x => new
{
Date = x.Key.Date,
MachineNum = x.Key.MachineNum,
AverageMU = x.Average(i => i.MU * 100)
// Instead of x.Average you may used other functions like: Count, Any etc.
})
以下 Select
将创建一个匿名类型,其中将包含:Date
、MachineNum
和 MU * 100
的平均值以获得百分比。
PS:我使用 lambda 而不是纯 LINQ,因为我不太喜欢使用 LINQ