c# - 使用 Linq 的数据透视表

标签 c# linq group-by pivot pivot-table

我有一个这样的表。(VisitType 是动态的)

PersonelId        VisitDate       VisitTypeId
1                 2015-02-24      A
2                 2015-02-23      S
2                 2015-02-24      D
4                 2015-02-22      S
2                 2015-02-22      A
2                 2015-02-22      B
3                 2015-02-23      A
1                 2015-02-23      A
1                 2015-02-24      D
4                 2015-02-24      S
4                 2015-02-22      S
2                 2015-02-22      S
3                 2015-02-24      D

我想使用如下所示的 linq 来了解这一点。

VisitDate   PersonelId      A      S     D     B
2015-02-22  4               0      2     0     0
2015-02-22  2               1      1     0     0
2015-02-23  2               0      1     0     0
2015-02-23  3               1      0     0     0
2015-02-23  1               1      0     0     0
2015-02-24  1               1      0     1     0
2015-02-24  2               0      0     1     0
2015-02-24  4               0      1     0     0
2015-02-24  3               0      0     1     0

我用这个linq

var d = (from f in _db.Visits
                 group f by new {f.VisitDate, f.PersonnelId }
                     into myGroup
                     where myGroup.Count() > 0
                     select new
                     {
                         myGroup.Key.VisitDate,
                         myGroup.Key.PersonnelId,
                         subject = myGroup.GroupBy(f => f.VisitTypeId).Select
                         (m => new { Sub = m.Count(), Score = m.Sum(c => c.Amount) })
                     }).ToList();

它按日期和人员 ID 分组,但不计算每个 VisitType 的项目。

最佳答案

试试这个:

//static headers version
var qry = Visits.GroupBy(v=>new{v.VisitDate, v.PersonelId})
    .Select(g=>new{
            VisitDate = g.Key.VisitDate,
            PersonelId = g.Key.PersonelId,
            A = g.Where(d=>d.VisitTypeId=="A").Count(),
            B = g.Where(d=>d.VisitTypeId=="B").Count(),
            D = g.Where(d=>d.VisitTypeId=="D").Count(),
            S = g.Where(d=>d.VisitTypeId=="S").Count()
            });

//dynamic headers version
var qry = Visits.GroupBy(v=>new{v.VisitDate, v.PersonelId})
    .Select(g=>new{
            VisitDate = g.Key.VisitDate,
            PersonelId = g.Key.PersonelId,
            subject = g.GroupBy(f => f.VisitTypeId)
                      .Select(m => new { Sub = m.Key, Score = m.Count()})
            });

关于c# - 使用 Linq 的数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28689376/

相关文章:

C# 泛型和多态性 : an oxymoron?

C# 用户输入,显示达到特定数字所需的差异

c# - 使用 LINQ 交换元素

SQL 查询 where SUM 包含 where 子句

c# - 索引在修剪文本处超出数组边界

c# - 将信息发送到另一个窗体 c#

c# - 将 foreach 循环转换为 LINQ 查询会破坏代码

c# - 使用 SUM 和 Group By 对两个表进行 Linq 查询

sql-server - 用于对分组值进行计数的 SQL 列

c# - 使用 Linq to GroupBy 和 Sum 数据表