结果中按客户分组的日历计数,按月显示活动客户

xmakbtuz  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(340)

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

  1. SELECT DISTINCT
  2. IF OBJECT_ID('tempdb.#TESTDATA21234') IS NOT NULL DROP TABLE #TESTDATA212
  3. SELECT DISTINCT
  4. C.ClientGroup,
  5. C.Client,
  6. C.AlternateCaseID,
  7. C.CaseOpenDate,
  8. C.CaseCloseDate,
  9. BR.Prod
  10. INTO #TESTDATA21234
  11. FROM
  12. TEST1 C
  13. LEFT JOIN TEST2 BR on BR.Id = C.id
  14. LEFT JOIN TEST3 CL on CL.Id = C.Id
  15. WHERE
  16. Cl.EndDate > GETDATE()
  17. AND C.CaseOpenDate between '2019-07-01' and '2020-07-01'
  18. OR
  19. Cl.EndDate > GETDATE()
  20. AND C.CASECLOSEDATe between '2019-07-01' and '9999-12-31'
  21. SELECT DISTINCT
  22. g.ClientGroup,
  23. (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',
  24. (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',
  25. (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',
  26. (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',
  27. (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',
  28. (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',
  29. (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',
  30. (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',
  31. (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',
  32. (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',
  33. (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',
  34. (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'
  35. from #testdata21234 g
  36. DROP TABLE #TESTDATA21234

下面是我得到的输出示例

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

我尝试按分组,并为此筛选器添加某些方面以启用此功能,但只收到“子查询返回的值超过1”。当子查询后跟=,!=,<,<=,>,>=或者子查询用作表达式时。”
请让我知道,如果有人有办法得到这个理想的结果。

7hiiyaii

7hiiyaii1#

我想问题出在最后一个问题上了。如果删除“distinct”并添加

  1. 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' 子查询中没有筛选器,因此它选择每个客户机

scyqe7ek

scyqe7ek2#

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

  1. SELECT g.ClientGroup,
  2. SUM(CASE WHEN g.CaseOpenDate < '2019-08-01' AND g.CaseCloseDate >= '2019-07-01'
  3. THEN 1 ELSE 0
  4. END) as July19,
  5. SUM(CASE WHEN g.CaseOpenDate < '2019-09-01' AND g.CaseCloseDate >= '2019-08-01'
  6. THEN 1 ELSE 0
  7. END) as August19,
  8. SUM(CASE WHEN g.CaseOpenDate < '2019-10-01' AND g.CaseCloseDate >= '2019-09-01'
  9. THEN 1 ELSE 0
  10. END) as September19,
  11. . . .
  12. from #testdata21234 g
  13. group by g.ClientGroup;

对于完全重叠或其他情况,很容易调整此逻辑。
除了更短更清晰之外,这个版本将比您的子查询版本快得多。
此外,您根本不需要临时表。你只需添加 group by 您的原始查询。

展开查看全部

相关问题