首页 > 解决方案 > 如何不重复计算查询中的行和对象?

问题描述

我希望为每月有请求的一组人计算一些实例,但是我只想计算一次,而不是这个人请求的次数。这是我的数据表的示例,因此这可能更有意义

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 进行过滤。我希望这更有意义,对任何混淆感到抱歉。

标签: sqlsql-serverdatecount

解决方案


您可以使用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;

推荐阅读