在单个sql查询中统计并返回多行,并将结果打印为表



我对sql查询有疑问。我会在上解释

**Table People**
| S.No| name|task|
| ----| ----|----|
| 1   | n1  |t1  |
| 2   | n2  |t2  |
| 3   | n3  |t1  |
| 4   | n4  |t1
| 5   | n5  |t2  |
**Table Tasks**
| S.No| taskid|taskname|
| ----| ----|----|
| 1   | t1  |task1|
| 2   | t2  |task2|
| 3   | t3  |task3|
| 4   | t4  |task4|
| 5   | t5  |task5|

我需要统计一项任务被分配给多少人,比如这个

**Expected result**
|task |count|
|-----|-----|
|task1| 3   |
|task2| 2   |
|task3| 0   | 

我尝试了下面这样的查询,但它不起作用

SELECT COUNT(TASK) FROM PEOPLE WHERE TASK IN (SELECT TASKID IN TASKS)

上面的查询返回所有任务的总数。我需要在查询中修改什么以获得预期结果

它更像是:

SELECT t.taskname as task, COUNT(p.task) as `count`
FROM 
task t
LEFT JOIN people p  ON p.task = t.taskid
GROUP BY
t.taskname

从tasks(获取所有任务记录)到people(可能没有获取任何people记录,因此对于task3,p.task为null)的左联接肯定包含所有任务,但不是所有people。。对于那些有多个人的任务,任务名称将重复多次。当它被分组时,它就变成了一个单独的,我们可以对进行相应的计数

计算p.task而不是COUNT(*)是很重要的,因为COUNT(*)将看到一行,如:

name,  p.task
task3, null

如果我们count(*)’d,它将计数为1,因为它是一行。。但是我们想要计算p.task,因为NULL从未被计算过,所以我们得到该任务的计数为0

我会把people.task称为people.taskid,就我个人而言是

我真的不知道你说的";将结果打印为表"-这确实是前端的工作,但如果您的意思是要格式化输出,那么您需要查看类似CONCAT(...)CONCAT_WS(...)的内容,这将允许您生成格式化文本作为输出

如果你的任务名称不是唯一的,那么你可以像@stickybit在评论中所说的那样,将t.taskid也放在组中(或者相反;如果它是表的主键)

我不知道为什么你想要任务1到3,而不是4或5。一种方法是关联子查询:

SELECT T.*,
(SELECT COUNT(*) FROM PEOPLE P WHERE P.TASK = T.TASKID) as cnt
FROM TASK T;

如果你只想要一个子集的任务,你可以添加一个WHERE子句:

SELECT T.*,
(SELECT COUNT(*) FROM PEOPLE P WHERE P.TASK = T.TASKID) as cnt
FROM TASK T;
WHERE TASK IN ('task1', 'task2', 'task3');

如果您只想要实际分配给人员的任务,则可以使用PEOPLE表上的聚合:

SELECT P.TASK, COUNT(*)
FROM PEOPLE P
GROUP BY P.TASK;

但这不会返回未分配的任务。

最新更新