表中每个组的每月计数
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')
【讨论】:
以上是关于表中每个组的每月计数的主要内容,如果未能解决你的问题,请参考以下文章