【发布时间】: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 关系。