表中每个组的每月计数

Posted

技术标签:

【中文标题】表中每个组的每月计数【英文标题】:Monthly count for each group from a table 【发布时间】:2017-12-29 11:24:14 【问题描述】:

表“RAW_DATA”的结构如下所示,给定列并给出一组样本数据

        ID  CompletedDate   TypeID  AgentID
        1   2015-09-22      51      301
        2   2015-08-6       50      301
        3   2015-07-12      50      305
        4   2017-04-21      51      305
        5   2015-05-5       51      305
        6   2016-09-8       50      301
        7   2015-02-17      50      301
        8   2015-01-12      51      311
        9   2015-10-4       50      311
        10  2015-12-2       51      311

使用下面的查询我可以从这个表中得到一个月的总计数

     SELECT FORMAT(CompletedDate,'MMMM yyyy') as Date,datepart(year,CompletedDate) YearNr,datepart(month,CompletedDate) MonthNr,
         COUNT(CASE WHEN TypeID=50 then 1 ELSE NULL END) as "Type1",
         COUNT(CASE WHEN  TypeID=51 then 1 ELSE NULL END) as "Type2"
         FROM RAW_DATA
         group by  datepart(year,CompletedDate),datepart(month,CompletedDate),  FORMAT(CompletedDate,'MMMM yyyy')

我得到的示例结果看起来像

        Date            YearNr  MonthNr Type1   Type2
        September 2016  2016    9       12282   224
        October 2015    2015    10      54      0
        November 2017   2017    11      5535    65
        March 2017      2017    3       1669    5641
        December 2016   2016    12      772     39      

现在我必须每月对“AgentID”列进行额外的分组。所以结果集应该像每个 Agent 一样,每个月的计数基于上述条件

我尝试在上述查询的选择和分组部分中添加“AgentID”列,如下所示

        SELECT AgentID,FORMAT(CompletedDate,'MMMM yyyy') as Date,datepart(year,CompletedDate) YearNr,datepart(month,CompletedDate) MonthNr,
         COUNT(CASE WHEN TypeID=50 then 1 ELSE NULL END) as "Type1",
         COUNT(CASE WHEN  TypeID=51 then 1 ELSE NULL END) as "Type2"
         FROM RAW_DATA
         group by  AgentID, datepart(year,CompletedDate), datepart(month,CompletedDate), FORMAT(CompletedDate,'MMMM yyyy')

但是生成的输出是这样的

        Date        AgentID YearNr  MonthNr Type1   Type2
        April 2016      3642    2016    4   21  39
        November 2016   2887    2016    11  1   0
        March 2017      2309    2017    3   0   24
        May 2017        2784    2017    5   1   24
        December 2017   3355    2017    12  2   0

这不是预期的结果。例如,对于每个代理,结果集中的所有月份都必须有一个条目

Agent1  April2016 
Agent1 Nov 2017
Agent1 Dec 2016 

现在是代理 2

Agent2  April2016 
Agent2 Nov 2017
Agent2 Dec 2016 

那么我怎样才能得到每个代理的每月计数?

【问题讨论】:

你有太多的代表点来思考“但没有工作”。是可接受的问题描述。 来吧,至少向我们展示不起作用的代码,并准确告诉我们它是如何不起作用的。您对 DID 的工作方式非常清楚和详细,但对您的实际问题却含糊不清且缺乏任何细节? 请添加所需的输出,您希望如何将每个代理每个月的计数与您按不同格式分组的现有查询集成?? 请查看编辑后的部分,详细了解我尝试了什么以及我得到的结果以及预期的结果 【参考方案1】:

您只需按agentId 和month_year 分组:

SELECT 
  AgentID,
  FORMAT(CompletedDate,'MMMM yyyy') as MonthYear,
  COUNT(CASE WHEN TypeID=50 then 1 ELSE NULL END) as "Type1",
  COUNT(CASE WHEN  TypeID=51 then 1 ELSE NULL END) as "Type2",
  COUNT(*) AS Total
FROM RAW_DATA
group by  AgentID, FORMAT(CompletedDate,'MMMM yyyy');

SQL Fiddle

【讨论】:

【参考方案2】:

只需在查询中将 Count(*) 添加为“monthelyAgentcount”,即

 SELECT AgentID,FORMAT(CompletedDate,'MMMM yyyy') as Date,datepart(year,CompletedDate) YearNr,datepart(month,CompletedDate) MonthNr,
     COUNT(CASE WHEN TypeID=50 then 1 ELSE NULL END) as "Type1",
     COUNT(CASE WHEN  TypeID=51 then 1 ELSE NULL END) as "Type2" ,
     Count(*) as "monthelyAgentcount"
     FROM RAW_DATA
     group by  AgentID,datepart(year,CompletedDate),datepart(month,CompletedDate),  FORMAT(CompletedDate,'MMMM yyyy')

【讨论】:

以上是关于表中每个组的每月计数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle表中多个组的列的总和值

按组的每个出现值构建计数列

每月每个类别的分组计数(当前月份与过去几个月的剩余时间)在 pandas 的单独列中

每月提供利润的代理的 SQL 计数

每月、每年分组的值计数 - Pandas

Laravel Eloquent groupBy() 并且还返回每个组的计数