Linq Sum基于一些专栏

时间:2014-04-25 08:48:23

标签: sql linq sum

我有一个查询返回特定CompanyId和特定月/年的一些值。

我想报一年的报告。 (所以我需要总结不同月份的价值,但同年和CompanyId)

以下是我的查询:

from er in EconomicReports
join com in Companies on er.CompanyId equals com.Id
join cou in Countries on com.CountryId equals cou.Id
where er.Year == 2014
select new 
{
Country = cou.Name,
CompanyId = com.Id,
CorporationId = com.CorporationId,
Year = er.Year,
RegisteredCases = er.NewCasesTotalCount,
RegisteredCasesAmount = er.NewCasesTotalAmount,
ResolvedCases = er.ClosedCasesTotalCount,
ResolvedCasesAmount = er.ClosedCasesCapitalAmount + er.ClosedCasesInterestAmount,
ActiveCases = (er.NewCasesTotalCount ?? 0) - (er.ClosedCasesTotalCount ?? 0),
ActiveCasesAmount = (er.NewCasesTotalAmount ?? 0) - (er.ClosedCasesCapitalAmount ?? 0) -  (er.ClosedCasesInterestAmount ?? 0)
}

enter image description here

基本上,第1行和第5行需要是一行,因为它们来自同一年,同一公司ID(我在结果中也将月份也放在一起,以便您看到不同的月份,但是同一年)< / p>

1 个答案:

答案 0 :(得分:1)

您需要GroupBy

var query = (from er in EconomicReports
            join com in Companies on er.CompanyId equals com.Id
            join cou in Countries on com.CountryId equals cou.Id
            where er.Year == 2014
            select new 
            {
                Country = cou.Name,
                CompanyId = com.Id,
                CorporationId = com.CorporationId,
                Year = er.Year,
                RegisteredCases = er.NewCasesTotalCount,
                RegisteredCasesAmount = er.NewCasesTotalAmount,
                ResolvedCases = er.ClosedCasesTotalCount,
                ResolvedCasesAmount = er.ClosedCasesCapitalAmount + er.ClosedCasesInterestAmount,
                ActiveCases = (er.NewCasesTotalCount ?? 0) - (er.ClosedCasesTotalCount ?? 0),
                ActiveCasesAmount = (er.NewCasesTotalAmount ?? 0) - (er.ClosedCasesCapitalAmount ?? 0) -  (er.ClosedCasesInterestAmount ?? 0)
            });

var result = query
    .GroupBy(u => new {u.Country, u.CompanyId, u.CorporationId, u.Year})
    .Select(u => new 
    {
        Country = u.Key.Country,
        CompanyId = u.Key.CompanyId,
        CorporationId = u.Key.CorporationId,
        Year = u.Key.Year,

        RegisteredCases = u.Select(t => t.RegisteredCases).DefaultIfEmpty().Sum(),
        RegisteredCasesAmount = u.Select(t => t.RegisteredCasesAmount).DefaultIfEmpty().Sum(),
        ResolvedCases = u.Select(t => t.ResolvedCases).DefaultIfEmpty().Sum(),
        ResolvedCasesAmount = u.Select(t => t.ResolvedCasesAmount).DefaultIfEmpty().Sum(),
        ActiveCases = u.Select(t => t.ActiveCases).DefaultIfEmpty().Sum(),
        ActiveCasesAmount = u.Select(t => t.ActiveCasesAmount).DefaultIfEmpty().Sum()
    })
    .ToList();

我认为CountryCorporationId对于基于CompanyIdYear的分组记录必须相同,所以我将它们包含在分组中,以便在{{中使用1}}