从另一个表中选择计数

时间:2017-04-09 03:04:45

标签: mysql sql sql-server

我有两张桌子:ToDoList& ToDotasks

我需要编写一个查询,它将返回ToTList列以及未完成任务的计数,即toDotasks表中taskstatus = 0的位置

我的查询:

SELECT *,(select count(*) from todotasks where taskstatus = 0 group by
listid) as TotalIncomplete FROM dbo.ToDoList

错误:子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

TodoList的:

    ListID  ListName
       1    List 5600
       2    List 22
       3    List 30
       4    List 4
       5    List 1

ToDotasks

taskid ListID   taskStatus
    3      2    0
    6      3    0
    14     3    0
    16     3    0
    19     4    1
    36     1    0
    38     1    1
    39     1    0
    40     2    0
    41     2    0

我在追求的是:

    ListID  ListName   TotalIncomplete
       1    List 5600       2
       2    List 22         3
       3    List 30         3
       4    List 4          0
       5    List 1          0

2 个答案:

答案 0 :(得分:1)

请尝试以下方法......

SELECT ToDoList.ListID AS ListID,
       ToDoList.ListName AS ListName,
       COUNT( incompleteTasks.ListID ) AS IncompleteTaskCount
FROM ToDoList
LEFT JOIN
(
    SELECT ListID AS ListID
    FROM ToDoTasks
    WHERE taskStatus = 0
) incompleteTasks ON ToDoList.ListID = incompleteTasks.ListID
GROUP BY ToDoList.ListID
ORDER BY ToDoList.ListID;

我使用的逻辑是......

要计算不完整的任务,我们首先需要列出taskStatus 0 taskid的任务。 taskStatus与计数无关,经过测试,ListID将无关紧要。因此,此列表只需要包含每个符合条件的任务incompleteTasks。我已将此列表命名为ToDoList LEFT JOIN incompleteTasks

incompleteTasks会为我们提供一个表格,其中包含来自ToDoList的每个值及其ToDoList的相应值。如果incompleteTasks中的记录在ToDoList中没有任何相应记录,我们会从NULL获得值LEFT JOIN值。

通过将ListID ed列表的值ListCOUNT()分组,我们实现了与所需输出相对应的分组。然后,我们使用ListID来计算incompleteTasksCOUNT()的加入列表字段中显示的次数。注意:NULL不计算ListID值。

然后可以使用ListORDER BY ToDoList.ListID的{​​{1}}值对上面生成的列表进行排序。

如果您有任何问题或意见,请随时发表评论。

答案 1 :(得分:-1)

非常直接..这是解决方案

select ToDoList.lisid, ToDoList.lastname, count(ToDoTasks.taskstatus) from
ToDoList JOIN ToDoTasks ON ToDoList.listid = ToDoTasks.listid 
where ToDoTasks.taskstatus = 0
group by ToDoList.listname,ToDoList.listid

使用您的表名更新查询.... 希望这可以帮助。干杯!!!