2013-06-04 148 views
0

我需要從具有不同條件的表中檢索日期,並將每個不同的數據與總和放在不同的列中。大量的測試後,我有這個疑問,但它的速度太慢,太大了,它不是檢索所有單位:從不同條件的相同表中檢索不同的值

SELECT cal.dt, cal.h, a.measure, b.measure, c.measure, d.measure, e.measure, f.measure, g.measure, h.measure, ud.unit_name 
FROM calendar cal 
LEFT JOIN (SELECT date_bid, hour, ROUND(SUM(measure),3) as measure, id_unit, id_agent FROM MEASURES 
    WHERE sesion = 0 AND date_bid BETWEEN '02/27/2013' AND '02/28/2013' GROUP BY date_bid, hour, id_unit, id_agent) a 
    ON a.date_bid = dt AND a.hour = h 
LEFT JOIN (SELECT date_bid, hour, ROUND(SUM(measure),3) as measure, id_unit, id_agent FROM MEASURES 
    WHERE sesion = 1 AND date_bid BETWEEN '02/27/2013' AND '02/28/2013' GROUP BY date_bid, hora, id_unit, id_agent) b 
    ON b.date_bid = dt AND b.hour = h AND a.id_unit = b.id_unit AND a.id_agent = b.id_agent 
LEFT JOIN (SELECT date_bid, hour, ROUND(SUM(measure),3) as measure, id_unit, id_agent FROM MEASURES 
    WHERE sesion = 2 AND date_bid BETWEEN '02/27/2013' AND '02/28/2013' GROUP BY date_bid, hour, id_unit, id_agent) c 
    ON c.date_bid = dt AND c.hour = h AND a.id_unit = c.id_unit AND a.id_agent = c.id_agent 
LEFT JOIN (SELECT date_bid, hour, ROUND(SUM(measure),3) as measure, id_unit, id_agent FROM MEASURES 
    WHERE sesion = 3 AND date_bid BETWEEN '02/27/2013' AND '02/28/2013' GROUP BY date_bid, hour, id_unit, id_agent) d 
    ON d.date_bid = dt AND d.hour = h AND a.id_unit = d.id_unit AND a.id_agent = d.id_agent 
LEFT JOIN (SELECT date_bid, hour, ROUND(SUM(measure),3) as measure, id_unit, id_agent FROM MEASURES 
    WHERE sesion = 4 AND date_bid BETWEEN '02/27/2013' AND '02/28/2013' GROUP BY date_bid, hour, id_unit, id_agent) e 
    ON e.date_bid = dt AND e.hour = h AND a.id_unit = e.id_unit AND a.id_agent = e.id_agent 
LEFT JOIN (SELECT date_bid, hour, ROUND(SUM(measure),3) as measure, id_unit, id_agente FROM MEASURES 
    WHERE sesion = 5 AND date_bid BETWEEN '02/27/2013' AND '02/28/2013' GROUP BY date_bid, hour, id_unit, id_agent) f 
    ON f.date_bid = dt AND f.hour = h AND a.id_unit = f.id_unit AND a.id_agent = f.id_agent 
LEFT JOIN (SELECT date_bid, hour, ROUND(SUM(measure),3) as measure, id_unit, id_agente FROM MEASURES 
    WHERE sesion = 6 AND date_bid BETWEEN '02/27/2013' AND '02/28/2013' GROUP BY date_bid, hour, id_unit, id_agent) g 
    ON g.date_bid = dt AND g.hour = h AND a.id_unit = g.id_unit AND a.id_agent = g.id_agent 
LEFT JOIN (SELECT date_bid, hour, ROUND(SUM(measure),3) as measure, id_unit, id_agent FROM MEASURES 
    WHERE sesion = 7 AND date_bid BETWEEN '02/27/2013' AND '02/28/2013' GROUP BY date_bid, hour, id_unit, id_agent) h 
    ON h.date_bid = dt AND h.hour = h AND a.id_unit = h.id_unit AND a.id_agent = h.id_agent 
INNER JOIN FACILITIES ud ON a.id_unit = ud.id_unit 
WHERE cal.dt BETWEEN '02/27/2013' AND '02/28/2013' AND a.id_agent = 42 
--GROUP BY a.date_bid, a.hour, ud.unit_name 
ORDER BY cal.dt, ud.unit_name, cal.h 

我試着用面前的桌子之間直接加入無子查詢而是因爲它沒有工作每個sesion可以有不同數量的結果。

現在的問題是,除了這個查詢需要大量時間之外,現在的問題是僅檢索出現在第一個子查詢(sesion = 1)上的單元的數據,並且當單元中沒有數據時,是沒有顯示其餘的數據。

我認爲應該有更好的方法來面對這個查詢。

回答

0

嘗試這一個 -

;WITH cte AS 
(
    SELECT date_bid , 
      hour , 
      ROUND(SUM(measure), 3) AS measure , 
      id_unit , 
      id_agent, 
      sesion 
    FROM MEASURES 
    WHERE sesion BETWEEN 0 AND 7 
      AND date_bid BETWEEN '02/27/2013' AND '02/28/2013' 
    GROUP BY date_bid , 
      hour , 
      id_unit , 
      id_agent , 
      sesion 
) 
SELECT cal.dt , 
     cal.h , 
     a.measure , 
     b.measure , 
     c.measure , 
     d.measure , 
     e.measure , 
     f.measure , 
     g.measure , 
     h.measure , 
     ud.unit_name 
FROM calendar cal 
LEFT JOIN cte a ON a.date_bid = dt 
    AND a.hour = h 
    AND a.sesion = 0 
LEFT JOIN cte b ON b.date_bid = dt 
    AND b.hour = h 
    AND a.id_unit = b.id_unit 
    AND a.id_agent = b.id_agent 
    AND b.sesion = 1 
LEFT JOIN cte c ON c.date_bid = dt 
    AND c.hour = h 
    AND a.id_unit = c.id_unit 
    AND a.id_agent = c.id_agent 
    AND c.sesion = 2 
LEFT JOIN cte d ON d.date_bid = dt 
    AND d.hour = h 
    AND a.id_unit = d.id_unit 
    AND a.id_agent = d.id_agent 
    AND d.sesion = 3 
LEFT JOIN cte e ON e.date_bid = dt 
    AND e.hour = h 
    AND a.id_unit = e.id_unit 
    AND a.id_agent = e.id_agent 
    AND e.sesion = 4 
LEFT JOIN cte f ON f.date_bid = dt 
    AND f.hour = h 
    AND a.id_unit = f.id_unit 
    AND a.id_agent = f.id_agent 
    AND f.sesion = 5 
LEFT JOIN cte g ON g.date_bid = dt 
    AND g.hour = h 
    AND a.id_unit = g.id_unit 
    AND a.id_agent = g.id_agent 
    AND g.sesion = 6 
LEFT JOIN cte h ON h.date_bid = dt 
    AND h.hour = h 
    AND a.id_unit = h.id_unit 
    AND a.id_agent = h.id_agent 
    AND h.sesion = 7 
JOIN FACILITIES ud ON a.id_unit = ud.id_unit 
WHERE cal.dt BETWEEN '02/27/2013' AND '02/28/2013' 
    AND a.id_agent = 42 
--GROUP BY a.date_bid, a.hour, ud.unit_name 
ORDER BY cal.dt , 
     ud.unit_name , 
     cal.h 
+0

謝謝,但此查詢需要爲我的檢索數據的同時,仍然有問題有關不採取一些單位(檢索相同的結果我查詢) – SysDragon

相關問題