代码之家  ›  专栏  ›  技术社区  ›  DooDoo

分组依据+非重复记录计数

  •  -1
  • DooDoo  · 技术社区  · 7 年前

    请考虑这些数据:

    Id        StateCode           PersonCode           Feature1
    -----------------------------------------------------------
    1             1                 2000                 10          
    2             1                 2000                 13      
    3             1                 3000                 20      
    4             2                 2000                 1      
    5             2                 2000                 13      
    6             2                 4000                 10      
    7             2                 4000                 11      
    8             2                 5000                 10      
    9             2                 5000                 1      
    10            3                 2000                 10      
    11            3                 3000                 9      
    12            3                 3000                 1      
    13            3                 3000                 4     
    

    我想得到这个结果 distinct StateCode & PersonCode

    Count       StateCode
      2            1
      3            2
      2            3
    

    我写了这个问题:

    SELECT COUNT(*) AS Count,aa.StateCode
    FROM   
         (select distinct StateCode, PersonCode
          from @tbl) aa
    GROUP BY aa.StateCode
    

    如何使用一个查询和分组依据编写此查询?

    如果可能的话,我如何用一个 LINQ 查询?

    谢谢

    4 回复  |  直到 7 年前
        1
  •  0
  •   DooDoo    7 年前

    您可以将查询写为:

    select count(distinct PersonCode) , StateCode from @tbl group by StateCode ;
    

    希望这对你有帮助!!

        2
  •  0
  •   Mani Deep    7 年前
    select count(DISTINCT PersonCode) , StateCode from @tbl group by StateCode ;
    

    distinct count(*)将为每个唯一计数返回一行。你想要的是 COUNT(DISTINCT expression ) :为组中的每一行计算表达式,并返回唯一的非空值数。

    裁判: https://stackoverflow.com/a/1521656/2750968

        3
  •  0
  •   Drag and Drop    7 年前

    尝试GroupBy

    class StateCodeCount
    {
        public int Count {get; set;}
        public int StateCode {get; set;}
    }
    
    var result = datatableStateCode
        .GroupBy(c => c.StateCode )
        .Select(c => new StateCodeCount
        {
            StateCode = c.Key,
            Count= x.Where(g => g.StateCode== c.Key)
                    .Select(t => t.PersonCode)
                    .Distinct()
                    .Count()
        })
        .ToList();
    
        4
  •  0
  •   Sergiu Motpan    7 年前

    如果您的DB服务器支持窗口功能,那么这里有一个解决方案:

    http://sqlfiddle.com/#!4/33986d/3

    SELECT DISTINCT StateCode, COUNT(DISTINCT PersonCode) OVER (PARTITION BY StateCode) AS "Count" from @tbl ORDER BY StateCode;