【问题标题】:In SQL, how do get counts for multiple is_contains() statements in the same column?在 SQL 中,如何获取同一列中多个 is_contains() 语句的计数?
【发布时间】:2021-11-05 16:50:18
【问题描述】:

我有一个数据集,其中将每一行显示为某人正在处理的任务。每行都有一个任务 ID 并显示该任务的所有者,但可以有多个所有者。如果有多个,则用逗号分隔。

| task_id | owner            |
|---------|------------------|
| ID 1    | Owner A, Owner B |
| ID 2    | Owner A          |
| ID 3    | Owner B, Owner C |
| ID 4    | Owner A, Owner C |
| ID 5    | Owner B          |

我想创建一个表格,将每个人分配给他们的任务数加起来,无论该人是否与其他人共享它,如下所示。

| task_count | owner   |
|------------|---------|
| 3          | Owner A |
| 3          | Owner B |
| 2          | Owner C |

我尝试通过使用 CASE 语句和 is_contains() 的聚合语句来做到这一点。

SELECT
        CASE
             WHEN is_contains(owner, 'Owner A')  = 1 THEN 'Owner A'
             WHEN is_contains(owner, 'Owner B')  = 1 THEN 'Owner B'
             WHEN is_contains(owner, 'Owner C')  = 1 THEN 'Owner C'
         END AS "owner",
     COUNT("task_id")
FROM  tasks
GROUP BY owner

但是输入的数字太少了,因为它会首先搜索所有者 A,如果找到了,它将只计算该行,因为所有者 A 和所有者 B 将失去一个计数。我需要找到一种方法来提供准确的数字,以显示每个所有者每次出现在所有者列中的时间。

我可以通过使用单独的计数列而不是一个 case 语句来做到这一点,但是我需要将所有列转为一列。可能我也可以使用一堆联合语句,但必须有更好的方法。有什么想法吗?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 谁创建了那个数据库?它没有标准化,应该改变。字符串中不能有多个值。这不是创建关系数据库的方法。有一个任务表、一个所有者表和一个任务所有者表来表示 m:n 关系。

标签: sql count case contains


【解决方案1】:

如果你使用的是 SQL Server,你可以使用string_split()

select trim(s.value), count(*)
from tasks t cross apply
     string_split(t.owner, ',') s
group by trim(s.value);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 2015-03-05
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多