left - 多個SQL計數與多個條件



sql join用法 (2)

我一直在試圖優化從數據庫檢索數據的方式,以便在軟件開發的“儀表板”類型的頁面上顯示

我的數據庫結構如下:

  • 需求表包含各個領域的所有各種需求,但重要的是一個REQ_ID作為關鍵。
  • 任務包含TASK_ID,TASK_NAME(DEV,TEST或RELEASE),TASK_STATUS(未開始,完成,被阻止),TASK_WINDOW(任務完成時的第1週,第2周等)的任務表可以包含多個任務,到REQ_I的要求。 例如,一個需求可能有多個開發任務,測試任務和發布任務,但只有在與需求相關的所有開發任務完成時才能開發完成,否則不完整

我想查詢這兩個表,為我提供一個結果集,其中包含單個查詢中每個DEV任務窗口的DEV完成,測試完成和發布完成要求的數量。 我目前正在執行多個查詢,每個包含子查詢,然後匯總結果與PHP,但總共需要15秒執行,任何人都可以幫助我鞏固到一個單一的查詢>


SELECT r.REQ_ID, 
       SUM(CASE WHEN t.TASK_NAME = 'DEV' THEN 1 ELSE 0 END) AS DevComplete,
       SUM(CASE WHEN t.TASK_NAME = 'TEST' THEN 1 ELSE 0 END) AS TestComplete,
       SUM(CASE WHEN t.TASK_NAME = 'RELEASE' THEN 1 ELSE 0 END) AS ReleaseComplete
    FROM Requirements r
        INNER JOIN Tasks t
            ON r.REQ_ID = t.REQ_ID
    WHERE t.TASK_STATUS = 'Complete'
    GROUP BY r.REQ_ID

我意識到這是一個古老的問題,但我運行了以下模式的測試:

模式1:

SELECT
 [Count1] = SUM(CASE WHEN ... THEN 1 ELSE 0 END),
 [Count2] = SUM(CASE WHEN ... THEN 1 ELSE 0 END)
FROM
 [Table]
GROUP BY
 [Field]

模式2:

SELECT
  [COUNT1] = (SELECT COUNT(*) FROM [Table] WHERE ...),
  [Count2] = (SELECT COUNT(*) FROM [Table] WHERE ...)

在我的情況下,當運行兩個查詢時,模式2花費了36%的時間,模式1花費了64%。 對我來說,模式1看起來更優雅,但在我的情況下表現不佳。





count