所以我想创建一个查询,它将返回 projects
的名称和 assigments
的数量,特别是与 project
相关严重性。例如:表 assignment
包含:
id | name | project_id | severity |
-----+-------------------------------------+-------------+-----------+
148 | Create background | 1 | 1|
184 | Create frontend | 1 | 1|
151 | Create Budged | 1 | 2|
155 | Assign all tasks | 1 | 3|
179 | Drink Beer | 1 | 1|
表project
仅包含name
和id
如下:
id | name
-----+-------------------------------------
1 | Very Important Project
我想创建一个将返回如下内容的查询:
projectid | projectname | CriticalAssig| MediumAssig | LowAssig
------------+-----------------------+--------------+-------------+----------
目前这对我有用:
SELECT p.id,
p.name,
Count(a1.id) AS one,
Count(a2.id) AS two,
Count (a3.id) AS three
FROM project p
INNER JOIN assign a1
ON a1.project_id = p.id
INNER JOIN assign a2
ON a2.project_id = p.id
INNER JOIN assign a3
ON a3.project_id = p.id
WHERE a2.severity = '2'
AND a1.severity = '1'
AND a3.severity = '3'
GROUP BY p.id,
p.name;
但是这个查询的结果在 one
、two
、three
列中是荒谬的,我得到像 90000
这样的数字(到处都是相同的数字)而简单查询 select count(*) from assig where project_id=x
返回 300
。
谁能指出我的错误所在?
最佳答案
你可以在没有任何连接的情况下做到这一点:
count(case when severity = 1 then 1 else null end) as one
(您当前查询中的问题是您在分组之前乘以行数。在开发聚合时,在没有聚合函数调用和分组依据/具有子句的情况下运行查询,以查看您实际计算的是什么、求和等)
关于SQL 查询以计算 3 种不同条件下的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20836432/