1

IDhouseIdおよびのテーブル A がありTaskます。IDTbleAIdDescriptionおよびを含む別のテーブル B がありStatusます。

テーブル構造

すべてのタスク、完了したタスク (すべてのステータスが「完了」に設定されているタスク)、および未完了のタスク (すべてのステータスが「完了」に設定されていないタスク) の数を取得したい

サンプルの画像を確認してください。

前もって感謝します!

4

4 に答える 4

0

私がこの質問を理解する方法:タスクA.IDIDであり、サブタスクのIDであり、サブタスクからその親タスクへの参照です。B.IDB.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 に答える
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
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 つのサブタスクが完了していない場合、平均は 1 未満になり、タスク全体が未完了であることを示します。

このソリューションは SQL Fiddle で試すことができます。

于 2012-12-04T21:09:35.640 に答える