我需要从具有不同条件的表中检索日期,并将每个不同的数据与总和放在不同的列中。经过大量测试后我得到了这个查询,但它太慢而且太大了,而且它没有检索所有单元:
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
我之前尝试过 JOINS直接在没有子选择的表格之间但是没有用,因为每个sesion
可能会有不同数量的结果。
现在的问题是,除了此查询所需的大量时间之外,问题是仅检索第一个子选择(sesion = 1
)上显示的单位的数据,以及当单位没有数据时在那里,没有显示其余的数据。
我认为应该有更好的方法来面对这个问题。
答案 0 :(得分: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