【问题标题】:Datatable Linq GroupBy, Aggregate Count数据表 Linq GroupBy,聚合计数
【发布时间】:2013-06-28 04:24:17
【问题描述】:

我有一个包含以下数据的数据表。我希望它按代码、名称、地区和月份分组 然后使用 LINQ 获取 covcode = (ip or OP) 的每个月的计数。

Code    Name                Region       Month  CovCode
6018    Provider - ONE      REGION2        1    OP
6018    Provider - ONE      REGION2        1    IP
6019    Provider - TWO      REGION3        2    OP
6019    Provider - TWO      REGION3        2    IP
6020    Provider - THREE    REGION4        3    IP
6020    Provider - THREE    REGION4        3    IP
6020    Provider - THREE    REGION4        3    OP

我想要的结果应该是这样的:

Code    Name                Region      MONTH1  IP  OP  MONTH2  IP  OP  MONTH3  IP  OP
6018    Provider - ONE      REGION2        2    1   1      0    0   0      0    0   0
6019    Provider - TWO      REGION3        0    0   0      2    1   1      0    0   0
6020    Provider - THREE    REGION4        0    0   0      0    0   0      3    2   1

这是我使用的返回错误结果的 linq。

var hospital = 
    from hosp in tblClaimsMain.AsEnumerable()          
    group hosp by hosp["ProviderCode"] into grp
    select new
    {
          ProviderCode = grp.Select(g => g["CODE"].ToString()).FirstOrDefault(),
      ProviderName = grp.Select(g => g["NAME"].ToString()).FirstOrDefault(),
      Region = grp.Select(g => g["REGION"].ToString()).FirstOrDefault(),
          MONTH1 = grp.Select(g => g["MONTH"].ToString() == "1").Count(),
          MONTH2 = grp.Select(g => g["MONTH"].ToString() == "2").Count(),
          MONTH3 = grp.Select(g => g["MONTH"].ToString() == "3").Count()

    };

编辑:

嗨,我现在可以获取每月计数,但另一方面,我仍然无法获取每个 covcode 的每月计数。我使用了下面的 linq。

var hospital = 
from hosp in tblClaimsMain.AsEnumerable()          
group hosp by new{CODE=hosp["CODE"],NAME=hosp["NAME"],REGION=hosp["REGION"]} into grp
select new
{
      ProviderCode = grp.Key.CODE,
      ProviderName = grp.Key.NAME,
      Region = grp.Key.REGION,
      MONTH1 = grp.Count(g => g["MONTH"].ToString() == "1"),
      IP1 = grp.Count(g => g["COVCODE"].ToString() == "INPATIENT"),
      OP1 = grp.Count(g => g["COVCODE"].ToString() != "INPATIENT"),
      MONTH2 = grp.Count(g => g["MONTH"].ToString() == "2"),
      IP2 = grp.Count(g => g["COVCODE"].ToString() == "INPATIENT"),
      OP2 = grp.Count(g => g["COVCODE"].ToString() != "INPATIENT"),
      MONTH3 = grp.Count(g => g["MONTH"].ToString() == "3")
      IP3 = grp.Count(g => g["COVCODE"].ToString() == "INPATIENT"),
      OP3 = grp.Count(g => g["COVCODE"].ToString() != "INPATIENT"),
};

【问题讨论】:

    标签: c# linq datatable group-by aggregate


    【解决方案1】:

    试试这样:

    var hospital = 
        from hosp in tblClaimsMain.AsEnumerable()          
        group hosp by new{CODE=hosp["CODE"],NAME=hosp["NAME"],REGION=hosp["REGION"]} into grp
        select new
        {
              ProviderCode = grp.Key.CODE,
              ProviderName = grp.Key.NAME,
              Region = grp.Key.REGION,
              MONTH1 = grp.Count(g => g["MONTH"].ToString() == "1"),
              IP1 = grp.Count(g =>g["MONTH"].ToString() == "1" && g["COVCODE"].ToString() == "IP"),
              OP1 = grp.Count(g =>g["MONTH"].ToString() == "1"&& g["COVCODE"].ToString() == "OP"),
              MONTH2 = grp.Count(g => g["MONTH"].ToString() == "2"),
              IP2 = grp.Count(g =>g["MONTH"].ToString() == "2" && g["COVCODE"].ToString() == "IP"),
              OP2 = grp.Count(g =>g["MONTH"].ToString() == "2"&& g["COVCODE"].ToString() == "OP"),
              MONTH3 = grp.Count(g => g["MONTH"].ToString() == "3"),
              IP3 = grp.Count(g =>g["MONTH"].ToString() == "3" && g["COVCODE"].ToString() == "IP"),
              OP3 = grp.Count(g =>g["MONTH"].ToString() == "3" && g["COVCODE"].ToString() == "OP")
        };
    

    【讨论】:

    • 嗨蒂姆,你的回复对我帮助很大,但是鉴于上面的示例,当我尝试获取每月计数和 covcode (IP,OP) 结果不正确。
    • 感谢您及时回复。我现在就试试。
    【解决方案2】:
    var queryZakaz = (
            from table in dtZakaz.AsEnumerable() 
            group table by table.Field<decimal>("DOCID") into g //группировка по DOCID
            select new
            {
                DOCID=g.Key,
                SUPPLIER_ID = g.Select(table => table["SUPPLIER_ID"].ToString()).FirstOrDefault(),
                totalCountZakazBEZ_NDS=Convert.ToDecimal( g.Where(table => table.Field<decimal>("TAXID") == 1).Count() ),
                totalCountZakazNDS = Convert.ToDecimal(g.Where(table => table.Field<decimal>("TAXID") == 2).Count()),
                totalSumZakazBEZ_NDS=g.Where(table => table.Field<decimal>("TAXID") == 1).Sum(table => table.Field<decimal>("PRICE1")),
                totalSumZakazNDS = g.Where(table => table.Field<decimal>("TAXID") == 2).Sum(table => table.Field<decimal>("PRICE1"))
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多