我有一個表A與ID
,houseId
和Task
。我有另一個表B與ID
,TbleAId
,Description
和Status
。子表狀態
我想要得到的所有的任務數量,完成的任務(其中所有的狀態設置爲「已完成」)和未完成的任務(其中所有的狀態沒有被設置爲「已完成」 )
檢查出來的圖像樣本:
提前感謝!
我有一個表A與ID
,houseId
和Task
。我有另一個表B與ID
,TbleAId
,Description
和Status
。子表狀態
我想要得到的所有的任務數量,完成的任務(其中所有的狀態設置爲「已完成」)和未完成的任務(其中所有的狀態沒有被設置爲「已完成」 )
檢查出來的圖像樣本:
提前感謝!
我似乎已經完全誤解了原來的問題。謝謝@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
的路上我理解這個問題: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
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,表示整個任務不完整。
您可以試試這個解決方案at SQL Fiddle。
試過了一個連接和一個組..但是沒有工作 –
對我來說,表結構並不合適。爲什麼TableA中的houseid而不是TableB?我可以看到有任務的參考表,因此「繪畫」將是任務,可以應用於許多表格。我沒有看到任務/ houseid組合級別有兩張表。什麼是生成這兩個表? –
我明白這個問題的方式:A中的ID是*任務的id,B中的ID是子任務的id,TableAID是從子任務到其父任務的引用。如果這個假設是正確的,那麼我認爲這個問題是關於計算所有具有所有**子任務的所有**任務**完成的... – poncha