sql - 如何不重复计算查询中的行和对象?
问题描述
我希望为每月有请求的一组人计算一些实例,但是我只想计算一次,而不是这个人请求的次数。这是我的数据表的示例,因此这可能更有意义
Client Customer ID Request ID RequestStartDate RequestEndDate
1 A1 9991 03/04/19 07/03/19
1 A1 9992 07/05/19 08/05/19
1 A1 9993 08/09/19 10/01/19
大约有 30k 个结果,但我写了一个查询来每月在请求请求时获取实例,这就是我想出的:
Select Distinct
CLient,
(SELECT COUNT(*) from #Testdata21234 where '2019-07-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.RequestStartDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.BRequestEndDate), 0) AND CLient = g.Client) as 'July19',
(SELECT COUNT(*) from #Testdata21234 where '2019-08-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.RequestStartDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.RequestEndDate), 0) AND CLient = g.Client) as 'August19',
(SELECT COUNT(*) from #Testdata21234 where '2019-09-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.RequestStartDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.RequestEndDate), 0) AND CLient = g.Client) as 'September19'
FROM #testdata21234 g
group by client
如果使用上面的示例,我的结果最终会是这样
July19 August19 September19
2 2 1
我希望我的输出得到以下信息:
July19 August19 September19
1 1 1
本质上,我希望这个计数一次,因为尽管有多个请求,但它在同一个客户 ID 下,并且我没有计算单独的实例,只是当客户主动提出请求时。
我希望这是有道理的,请,任何帮助都会很棒。
编辑:
为了进一步解释,让我们试试这个例子
Client Customer ID RequestID RequestStartDate RequestEndDate
1 A1 9991 03/03/19 07/03/19
1 A1 9992 07/05/19 08/05/19
1 A1 9993 08/09/19 10/01/19
1 A2 9994 07/02/19 07/10/19
1 A2 9995 07/15/19 08/06/19
1 A3 9996 02/01/19 07/01/19
1 A4 9997 08/05/19 08/16/19
1 A4 9998 08/30/19 09/01/19
对于上面的示例,我需要按月计算以下计数的结果
July19 August19 Septemeber19
4 3 2
我是根据 clientID 计算的,但是需要根据 requestID 进行过滤。我希望这更有意义,对任何混淆感到抱歉。
解决方案
您可以使用count(distinct)
并从根本上简化日期比较逻辑。我很确定您希望客户与月份完全重叠,所以:
Select client,
(select count(*)
from #Testdata21234 g2
where g2.RequestStartDate < '2019-08-01' and
g2.RequestEndDate >= '2019-07-01'
) July19,
(select count(*)
from #Testdata21234 g2
where g2.RequestStartDate < '2019-09-01' and
g2.RequestEndDate >= '2019-08-01'
) Aug19,
(select count(*)
from #Testdata21234 g2
where g2.RequestStartDate < '2019-10-01' and
g2.RequestEndDate >= '2019-09-01'
) Sep19
from (select distinct client #testdata21234) g;
推荐阅读
- odata - Odata 服务元数据失败
- powershell - 将 CSV 函数从 Int 更改为 Array
- 360-virtual-reality - 如何使用虚幻引擎 VR 与 360 度移动视频进行交互?
- ios - 具有后端生成内容的苹果商店应用程序
- linux - gdb远程内核调试增加bug
- wordpress - 创建的通知栏未显示在我的网站上
- airflow - 启动和停止气流?
- delphi - 使用运行时库的 Delphi 64 位调试有错误的堆栈帧处于活动状态
- tensorflow - 密集函数输入形状与 keras 中的一个热编码训练数据不匹配
- javascript - 在 AnyChart 极坐标图中为每个象限设置背景