ID
、houseId
およびのテーブル A がありTask
ます。ID
、TbleAId
、Description
およびを含む別のテーブル B がありStatus
ます。
すべてのタスク、完了したタスク (すべてのステータスが「完了」に設定されているタスク)、および未完了のタスク (すべてのステータスが「完了」に設定されていないタスク) の数を取得したい
サンプルの画像を確認してください。
前もって感謝します!
私がこの質問を理解する方法:タスクのA.ID
IDであり、サブタスクのIDであり、サブタスクからその親タスクへの参照です。B.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
私は最初に質問を完全に読み違えたようです。明確にしてくれてありがとう@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
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
少し異なる方法を使用する、さらに別の二重グループ化ソリューションを次に示します。
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 つのサブタスクが完了していない場合、平均は 1 未満になり、タスク全体が未完了であることを示します。
このソリューションは SQL Fiddle で試すことができます。