在 SQL Server 中显示按聚合条件筛选的月份

Show month filtered by aggregation condition in SQL Server

提问人:justnewbie89 提问时间:3/26/2019 最后编辑:marc_sjustnewbie89 更新时间:3/26/2019 访问量:79

问:

我有一张包含customer_id及其apply_date的表格。我想向2016年的所有月份展示,申请贷款的客户数量比当年的月平均客户数量高出30%。

customer_id   apply_date
-------------------------
1             2016-01-01
2             2016-02-01
3             2016-02-01
4             2016-02-01
5             2016-03-01
6             2016-03-01
7             2016-03-01
8             2016-03-01
9             2016-04-01
10            2016-05-01
11            2017-02-01
12            2017-02-01
13            2017-02-01

在此表中,2016 年每月有 2 个客户申请(平均 10 个客户除以 5 个月)。比月平均值高 30% 的术语是将平均值 2 乘以 1.3,我们得到 2.6。

期望的结果是我想显示每个月有超过 2.6 个客户的月份。

通过使用上面的表格,与条件匹配的 2016 年月份只是第 2 个月和第 5 个月。

上表只是数据中的样本。

我尝试使用此代码

select 
    datepart(mm, apply_date) as month, count(*) as cnt
from 
    Leads
where 
    apply_date between '2016-01-01' and '2017-01-01'
group by 
    datepart(mm, apply_date)

但我不知道如何根据给定的条件过滤数据。

SQL Server 日期 聚合

评论

0赞 D-Shih 3/26/2019
您能否提供样本数据并期待结果?你如何计算申请贷款的客户数量是30%
0赞 Hasan Mahmood 3/26/2019
@muhnandap,您能否提供整个表格结构和一些示例数据?
0赞 justnewbie89 3/26/2019
@HasanMahmood感谢您的回复。我已经更新了我的问题

答:

0赞 Hasan Mahmood 3/26/2019 #1

试试这个代码:

DECLARE @Leads TABLE
(
    customer_id    INT,
    apply_date DATETIME
)

INSERT INTO @Leads(customer_id, apply_date)VALUES(1,'2016-01-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(2,'2016-02-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(3,'2016-02-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(4,'2016-02-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(5,'2016-03-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(6,'2016-03-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(7,'2016-03-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(8,'2016-03-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(9,'2016-04-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(10,'2016-05-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(11,'2017-02-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(12,'2017-02-01');
INSERT INTO @Leads(customer_id, apply_date)VALUES(13,'2017-02-01');

--SELECT * FROM @Leads

DECLARE @avgInYear DECIMAL(18,2)

SELECT @avgInYear = SUM(a.NoOfCus)/ CAST(COUNT(a.MonthNo) AS DECIMAL(18,2)) FROM (
SELECT DISTINCT MonthNo = MONTH(apply_date), COUNT(customer_id) NoOfCus FROM @Leads
where apply_date between '2016-Jan-01' and '2017-Dec-01'
GROUP BY MONTH(apply_date) ) AS a

SELECT @avgInYear = @avgInYear * 1.3

select datepart(mm,apply_date) as month, COUNT(customer_id) as cnt
from @Leads
where apply_date between '2016-Jan-01' and '2017-Dec-01'
group by datepart(mm,apply_date)
HAVING CAST(COUNT(customer_id) AS DECIMAL(18,2)) > @avgInYear

评论

0赞 Hasan Mahmood 3/26/2019
@muhnandap如果这可行,你能把“这个答案标记为有用”吗?