在 SQL Server 查询中有条件地应用多个计数
Posted
技术标签:
【中文标题】在 SQL Server 查询中有条件地应用多个计数【英文标题】:Apply multiple count conditionally in SQL Server query 【发布时间】:2021-07-21 17:52:41 【问题描述】:我有一个task
表,其中包含一些DateTime
类型的列,如已完成、待处理、异常。它加入了user
表,我想带上userName, AllTaskCount, AllPendingTaskCount, AllCompletedTaskCount, AllExceptionTaskCount
。
如果Completed
列的值大于它将被视为已完成的任务,而如果completed
列为空且exception
列中的值则它是 ExceptionTask 并且如果Completed
列既没有值也没有@987654330 @ 一个比它正在等待的任务。
所以我想在上述给定条件下有条件地应用多个计数。请帮忙...
【问题讨论】:
您需要向minimal reproducible example 提供样本数据、预期结果、实际结果以及您迄今为止的尝试。并且只标记您正在使用的实际版本 - 这似乎是一个不支持的版本,所以应该尽快升级。 请提供表架构和示例数据。 【参考方案1】:您可以使用CTEs
获取结果。
WITH Result AS(
SELECT *, COUNT(1) OVER (ORDER BY Id) AS AllTasksCount
FROM User U
JOIN TASK T ON U.Id = T.UserId
),PendingTasks AS (
SELECT [NAme], COUNT(1) AS AllPendingTaskCount FROM Result
WHERE Completed IS NULL and Exception IS NULL
GROUP BY [Name]
),CompletedTasks AS (
SELECT [NAme], COUNT(1) AS AllCompletedTaskCount FROM Result
WHERE Completed IS NOT NULL and Exception IS NULL
GROUP BY [Name]
),ExceptionTasks AS (
SELECT [NAme], COUNT(1) AS AllExecptionTaskCount FROM Result
WHERE Completed IS NULL and Exception IS NOT NULL
GROUP BY [Name]
)
SELECT DISTINCT R.[Name]
,AllTasksCount
,AllPendingTaskCount
,AllCompletedTaskCount
,AllExecptionTaskCount
FROM Result R
JOIN PendingTasks PT
ON PT.[Name] = R.[Name]
JOIN CompletedTasks CT
ON CT.[Name] = R.[Name]
JOIN ExceptionTasks ET
ON ET.[Name] = R.[Name]
添加了示例架构和数据。请根据您的要求进行更新。 SQLFiddle
【讨论】:
以上是关于在 SQL Server 查询中有条件地应用多个计数的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种写法