首页 > 解决方案 > Sql 查询,它根据一个表中的分组值返回具有计数的列

问题描述

我有一个任务表。一个 Activity 可能有许多具有不同状态的任务。我需要在主活动视图中添加列,以显示打开任务、关闭任务和总任务的数量。我想我会创建一个视图,其中按活动分组的总数,然后通过 ActivityID 加入。我无法使用正确的数字创建视图,请帮助。这不会返回正确的数字:

等同于“OpenTasks”的状态值为 0,1 和 3。“ClosedTasks”为 3

现有表 - 任务

    ID          |  WorkID|    Status
    1           |  5     |    2
    2           |  5     |    2
    3           |  5     |    0
    4           |  5     |    3
    5           |  6     |    2
    6           |  7     |    0
    7           |  7     |    0
    8           |  9     |    1
    9           |  9     |    2

我需要的结果视图是:

    WorkID | OpenTasks | ClosedTasks | TotalTasks
     5     | 2         | 2           | 4
     6     | 0         | 1           | 1
     7     | 2         | 0           | 2
     9     | 1         | 1           | 2
SELECT top 10000 WorkActivityId,
    COUNT(CASE WHEN status = 2 then 1 ELSE NULL END) as "ClosedTasks",
    COUNT(CASE WHEN status <> 2 then 1 ELSE NULL END) as "OpenTasks",
    COUNT(CASE WHEN status < 10 then 1 ELSE NULL END) as "TotalTasks"
FROM    [SDMTWorkActivity].[WorkActivity].[Tasks]
GROUP BY WorkActivityId order by WorkActivityId

我不像 SQL 那样出色,所以感谢任何建议谢谢

标签: sqlgroup-bycountcase

解决方案


您的查询应该可以工作,但您可以尝试以下使用sum

SELECT 
    WorkId,
    SUM(CASE WHEN status <> 2 then 1 ELSE 0 END) as "OpenTasks",
    SUM(CASE WHEN status = 2 then 1 ELSE 0 END) as "ClosedTasks",
    SUM(CASE WHEN status < 10 then 1 ELSE 0 END) as "TotalTasks"
FROM [SDMTWorkActivity].[WorkActivity].[Tasks]
GROUP BY WorkId 
order by WorkId

输出:

| WorkId | OpenTasks | ClosedTasks | TotalTasks |
| ------ | --------- | ----------- | ---------- |
| 5      | 2         | 2           | 4          |
| 6      | 0         | 1           | 1          |
| 7      | 2         | 0           | 2          |
| 9      | 1         | 1           | 2          |

推荐阅读