结果中按月显示活跃客户的子查询中按客户客户分组的日历计数

Calendar Count Grouped By Client Customer From Subquery in results showing active client by month

我 运行 遇到了我编写的查询的问题,该查询显示了过去 12 个月所有客户每月 ID 的活跃计数。问题是此计数在所有客户端中显示相同,因此当将结果移至我的数据可视化时,我希望能够按公司过滤并仅显示公司的结果,而不是所有公司一起显示相同的结果。

        SELECT DISTINCT

IF OBJECT_ID('tempdb.#TESTDATA21234') IS NOT NULL DROP TABLE #TESTDATA212

SELECT DISTINCT
    C.ClientGroup,
    C.Client,
    C.AlternateCaseID,
    C.CaseOpenDate,
    C.CaseCloseDate,
    BR.Prod

    INTO #TESTDATA21234
FROM
    TEST1 C
    LEFT JOIN TEST2 BR on BR.Id = C.id
    LEFT JOIN TEST3 CL on CL.Id = C.Id


WHERE
    Cl.EndDate > GETDATE()
    AND C.CaseOpenDate between '2019-07-01' and '2020-07-01'

    OR

    Cl.EndDate > GETDATE()
    AND C.CASECLOSEDATe between '2019-07-01' and '9999-12-31'


 SELECT DISTINCT   
    g.ClientGroup,
    (SELECT COUNT(*) from #Testdata21234 where '2019-07-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'July19',
    (SELECT COUNT(*) from #Testdata21234 where '2019-08-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'August19',
    (SELECT COUNT(*) from #Testdata21234 where '2019-09-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'September19',
    (SELECT COUNT(*) from #Testdata21234 where '2019-10-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'October19',
    (SELECT COUNT(*) from #Testdata21234 where '2019-11-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'November19',
    (SELECT COUNT(*) from #Testdata21234 where '2019-12-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'December19',
    (SELECT COUNT(*) from #Testdata21234 where '2020-01-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'January20',
    (SELECT COUNT(*) from #Testdata21234 where '2020-02-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'February20',
    (SELECT COUNT(*) from #Testdata21234 where '2020-03-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'March20',
    (SELECT COUNT(*) from #Testdata21234 where '2020-04-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'April20',
    (SELECT COUNT(*) from #Testdata21234 where '2020-05-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'May20',
    (SELECT COUNT(*) from #Testdata21234 where '2020-06-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) ) as 'June20'
    
    
    
    from #testdata21234 g
    
    
        DROP TABLE #TESTDATA21234

这是我得到的输出示例

ClientGroup July19  August19    September19 October19   November19  December19  January20   February20  March20 April20 May20   June20
Comp1   45597   46350   45954   47141   45524   45978   48027   46608   50039   49093   43437   44524
Comp2   45597   46350   45954   47141   45524   45978   48027   46608   50039   49093   43437   44524
Comp3   45597   46350   45954   47141   45524   45978   48027   46608   50039   49093   43437   44524
Comp4   45597   46350   45954   47141   45524   45978   48027   46608   50039   49093   43437   44524
Comp5   45597   46350   45954   47141   45524   45978   48027   46608   50039   49093   43437   44524

我曾尝试分组依据并向此过滤器添加某些方面以启用此功能,但只收到 - “子查询返回超过 1 个值。当子查询跟在 =, ! =, <, <= , >, >= 或当子查询用作表达式时。"

如果有人知道如何获得所需结果,请告诉我。

我想问题出在最后一个查询中。 如果您删除 'distinct' 并添加

group by g.ClientGroup

最后

在此之后,更改每个计数中的子查询。例如:

(SELECT COUNT(*) from #Testdata21234 where '2019-07-01' BETWEEN dateadd(month, datediff(MONTH, 0, #testdata21234.CaseOpenDate), 0) and dateadd(month, datediff(MONTH, 0, #testdata21234.CaseCloseDate), 0) AND ClientGroup = q.ClientGroup ) as 'July19'

等 子查询中没有过滤器,所以它选择每个客户端

您不需要临时 table。但如果你必须有一个,就使用条件聚合。从我从您的数据中可以看出,您希望案例在一个月内至少重叠一天。如果这是正确的,那么:

SELECT g.ClientGroup,
       SUM(CASE WHEN g.CaseOpenDate < '2019-08-01' AND g.CaseCloseDate >= '2019-07-01'
                THEN 1 ELSE 0
           END) as July19,
       SUM(CASE WHEN g.CaseOpenDate < '2019-09-01' AND g.CaseCloseDate >= '2019-08-01'
                THEN 1 ELSE 0
           END) as August19,
       SUM(CASE WHEN g.CaseOpenDate < '2019-10-01' AND g.CaseCloseDate >= '2019-09-01'
                THEN 1 ELSE 0
           END) as September19,
       . . .
from #testdata21234 g
group by g.ClientGroup;

针对完全重叠或其他条件调整此逻辑很容易。

除了更短更清晰之外,这个版本将比您的子查询版本快得多。

此外,您根本不需要临时 table。您可以将 group by 添加到您的原始查询中。