在 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链接查询

针对多个条件的不同记录的 SQL 计数

SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种写法

mysql原生语句where数组条件查询

使用 LIKE 将 Oracle 查询转换为 SQL Server 查询

sql server怎么把多个查询结果关联起来