【问题标题】:Select count from another table从另一个表中选择计数
【发布时间】:2017-04-09 03:04:44
【问题描述】:

我有两个表:ToDoList 和 ToDotasks

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

我的查询:

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

错误:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

待办事项:

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

待办事项

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

【问题讨论】:

  • 您的查询有什么问题? IOW,你问的是什么?
  • 你有SELECT **,应该是SELECT *
  • 是的,由于某种原因,stackoverflow 隐藏了一个 *...所以我添加了 2
  • 我需要第三列,它是根据不完整的任务计数计算出来的
  • 1 List 5600 3 最后第 3 列怎么样,不应该是 1 还是 2?

标签: mysql sql sql-server


【解决方案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;

我使用的逻辑是……

要计算未完成任务的数量,我们首先需要一个包含taskStatus0 的任务列表。 taskid 将与计数无关,一旦测试,taskStatus 将无关紧要。因此这个列表只需要包含每个合格任务的ListID。我已将此列表命名为 incompleteTasks

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

通过将LEFT JOINed 列表从List 中的ListID 值分组,我们实现了与所需输出相对应的分组。然后我们使用COUNT() 来计算ListIDincompleteTasks 出现在我们加入列表的字段中的次数。注意:COUNT() 不计算 NULL 值。

然后可以使用ORDER BY ToDoList.ListIDList 中的ListID 的值进行排序。

如果您有任何问题或cmets,请随时发表相应的评论。

【讨论】:

  • 您好 toonice,我已经更新了表格和表格名称以使其更清晰
  • Msg 8120, Level 16, State 1, Line 2 列 'ToDoList.ListName' 在选择列表中无效,因为它不包含在内
  • 发现并纠正了一个错误。我还更新了表名和字段名。
  • 已添加说明。
  • 你的答案是正确的。唯一缺少的是我还必须按 ToDoList.ListName 分组。
【解决方案2】:

它非常简单。这是解决方案

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

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

【讨论】:

  • 嗨,杰克。这正是我所需要的,但它不返回任何 ToDoList 行,其中没有相应的 todotasks 数据或没有不完整的 todotasks
  • 谢谢杰克。这正是我所需要的,但它不返回任何 ToDoList 行,其中没有相应的 todotasks 数据或没有不完整的 todotasks
  • 好的,没问题。所以只需编辑我的查询并放置一个 LEFT JOIN 而不仅仅是 JOIN。这将解决您的问题。
  • 我尝试了 LEFT join...但它仍然没有显示丢失的行
  • @RahulBhatia - 只要数据 / 在这种情况下 LISTID 存在于两个表中,它就应该带回数据。您可以发布答案以便我可以相应地进行操作吗?我们正在使用 LEFT JOIN,因此如果没有匹配的数据,您将从 ToDoList 表中获取所有内容,并且任务状态中的 Nulls,
猜你喜欢
  • 2013-07-17
  • 2020-06-19
  • 1970-01-01
  • 2015-04-10
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2014-06-12
相关资源
最近更新 更多