2012-12-03 53 views
1

我有一個表A與ID,houseIdTask。我有另一個表B與ID,TbleAId,DescriptionStatus子表狀態

Table Structure

我想要得到的所有的任務數量,完成的任務(其中所有的狀態設置爲「已完成」)和未完成的任務(其中所有的狀態沒有被設置爲「已完成」 )

檢查出來的圖像樣本:

提前感謝!

+0

試過了一個連接和一個組..但是沒有工作 –

+0

對我來說,表結構並不合適。爲什麼TableA中的houseid而不是TableB?我可以看到有任務的參考表,因此「繪畫」將是任務,可以應用於許多表格。我沒有看到任務/ houseid組合級別有兩張表。什麼是生成這兩個表? –

+0

我明白這個問題的方式:A中的ID是*任務的id,B中的ID是子任務的id,TableAID是從子任務到其父任務的引用。如果這個假設是正確的,那麼我認爲這個問題是關於計算所有具有所有**子任務的所有**任務**完成的... – poncha

回答

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 
+0

TableAID是任務ID,而不是房子編號(據我瞭解樣本數據) – poncha

+0

謝謝。 。 。我修復了查詢。表格結構真的很亂。 –

+0

我不確定這會產生預期的結果......看到它將計算B完成或不完成的子任務的總數,但不會總結是否所有**的子任務同樣的任務也完成了......至少,這是我認爲OP的想法 – poncha

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 
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 
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,表示整個任務不完整。

您可以試試這個解決方案at SQL Fiddle