【发布时间】:2018-08-06 04:23:01
【问题描述】:
我已经使用 T-SQL 很长一段时间了,无法比我更好地进行聚合,这个例子将强调这一点。我敢肯定,可能有一些问题可以解决这个问题,但是,我不知道如何询问它,我也不知道如何更好地搜索它。
我有一个视图可以汇总每个团队成员的一些活动记录 Sample ActivityDetail ...
我需要做的其中一件事是获取给定时间段内所有团队成员的聚合(按成员的活动计数)。我发现使用本网站其他地方的串联黑客可以很容易地在每个成员/活动的专用行中获取每个活动总计
SELECT DISTINCT
a.Member
, a.Activity
, COUNT(CONCAT(a.Member,a.Activity)) AS ActivityCount
FROM v_Activity a
WHERE a.Activity_Date > DATEADD(DAY,-7,GETDATE())
GROUP BY a.Member,a.Activity
ORDER BY a.Member
Sample ActivityTotals 但是我们在这里真正要寻找的是对此的更统一的表示。现在,我知道我可以像这样为每个 ActivityType 执行 COUNT(*) 子查询来到达那里
SELECT DISTINCT
a.Member
, (SELECT COUNT(*) FROM v_UpdateActivity WHERE Member = a.Member AND Activity = 'Create' AND Activity_Date > DATEADD(DAY,-7,GETDATE())) As Created
, (SELECT COUNT(*) FROM v_UpdateActivity WHERE Member = a.Member AND Activity = 'Update' AND Activity_Date > DATEADD(DAY,-7,GETDATE())) As Updated
, (SELECT COUNT(*) FROM v_UpdateActivity WHERE Member = a.Member AND Activity = 'Document' AND Activity_Date > DATEADD(DAY,-7,GETDATE())) As Documented
, (SELECT COUNT(*) FROM v_UpdateActivity WHERE Member = a.Member AND Activity = 'Deactivate' AND Activity_Date > DATEADD(DAY,-7,GETDATE())) As Deactivated
, (SELECT COUNT(*) FROM v_UpdateActivity WHERE Member = a.Member AND Activity = 'Reactivate' AND Activity_Date > DATEADD(DAY,-7,GETDATE())) As Reactivated
FROM v_cw_ConfigUpdateActivity a
WHERE a.Activity_Date > DATEADD(DAY,-7,GETDATE())
ORDER BY a.Member
这在获得我想要的输出方面做得不错(包括没有活动的零)。 Desired Output
但是(a)这是低效的 - 它已经表现不佳,并且(b)这只是尖叫聚合,但我显然太厚了,无法想出正确的方法来构建它以获得我正在寻找的东西。有什么帮助吗?
【问题讨论】:
标签: tsql aggregation