1

I have a table A with ID, houseId and Task. I have another table B with ID, TbleAId, Description and Status.

Table Structure

I want to get count of all the tasks, completed tasks (where the status for all is set to 'Completed') and incomplete tasks (where the status for all is not set to 'Completed')

Check out the image for a sample:

Thanks in advance!

4

4 回答 4

0
SELECT
  HouseID,
  count(*) as Total_Tasks,
  Sum(Total_SubTask=Completed_SubTask) as Completed_Tasks,
  Sum(Total_SubTask<>Completed_SubTask) as Incomplete_Tasks
FROM
  TableA inner join (
    SELECT
      TbleAID,
      Count(*) as Total_SubTask,
      Sum(Status='Completed') as Completed_SubTask
    FROM TableB
    GROUP BY TbleAID) s on tablea.ID = s.TbleAID
GROUP BY HouseID
于 2012-12-03T21:31:22.130 回答
0

这是另一个双重分组解决方案,它使用了稍微不同的方法:

SELECT
  a.HouseID,
  COUNT(*)                        AS TotalTasks,
  COUNT(b.TaskStatus = 1 OR NULL) AS CompletedTasks,
  COUNT(b.TaskStatus < 1 OR NULL) AS InCompleteTasks
FROM TableA a
  INNER JOIN (
    SELECT
      TbleAID,
      AVG(CASE Status WHEN 'Completed' THEN 1 ELSE 0 END) AS TaskStatus
    FROM TableB
    GROUP BY TbleAID
  ) b ON a.ID = b.TbleAID
GROUP BY a.HouseID
;

基本上,它将文本状态替换为数字状态:1 表示其他状态Completed,0 表示其他状态。对于每个任务,都会计算平均状态。如果结果为1,则表示所有子任务也为1,即完成,所以任务也完成了。

如果至少有一个子任务没有完成,则平均值将小于 1,从而表明整个任务是不完整的。

您可以在 SQL Fiddle尝试此解决方案。

于 2012-12-04T21:09:35.640 回答
0

我似乎完全误读了这个问题。感谢@poncha 澄清它。您想在按房屋汇总之前按任务进行汇总:

select HouseId,
       count(*) as NumTasks,
       sum(case when NotCompletedSubTask = 0 then 1 else 0 end) as Completed,
       sum(case when NotCompletedSubtask > 0 then 1 else 0 end) as NotCompleted
from (select b.TbleAId, a.HouseId
             sum(case when status = 'Completed' then 1 else 0 end) as CompletedSubTask,
             sum(case when status <> 'Completed' then 1 else 0 end) as NotCompletedSubTask
      from TableB b join
           TableA a
           on b.TbleAID = a.ID
      group by b.TbleAId, a.HouseId
     ) t
group by HouseId
于 2012-12-03T20:56:27.177 回答
0

理解这个问题的方式:A.ID任务的 id ,B.ID子任务的 id ,B.TableAID是从子任务到其父任务的引用。

如果这个假设是正确的,那么我认为问题是关于计算所有完成所有子任务的任务......

有点复杂,但或多或​​少应该是这样的,除非您要使用临时表或 SQL 之外的代码:

SELECT
A.HouseID,
COUNT(DISTINCT A.ID) as `Total Task`,
SUM(IF(C.TableAID IS NOT NULL AND C.total=C.completed,1,0)) AS `Completed Tasks`,
SUM(IF(C.TableAID IS NOT NULL AND C.total=C.completed,0,1)) AS `Incomplete Tasks`
FROM A
LEFT JOIN (
  SELECT TableAID,COUNT(*) AS total, SUM(IF(status='Completed',1,0)) AS completed
  FROM B
  GROUP BY TableAID
  ) AS C ON A.ID=C.TableAID
GROUP BY A.HouseID
于 2012-12-03T21:06:01.233 回答