结果中按月显示活跃客户的子查询中按客户客户分组的日历计数
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
添加到您的原始查询中。
我 运行 遇到了我编写的查询的问题,该查询显示了过去 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
添加到您的原始查询中。