Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从具有不同条件的同一表中检索不同的值_Sql_Sql Server 2005 - Fatal编程技术网

Sql 从具有不同条件的同一表中检索不同的值

Sql 从具有不同条件的同一表中检索不同的值,sql,sql-server-2005,Sql,Sql Server 2005,我需要从一个具有不同条件的表中检索日期,并将每个不同的数据和总和放在不同的列中。经过大量测试后,我得到了这个查询,但它太慢太大,而且无法检索所有单元: 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,

我需要从一个具有不同条件的表中检索日期,并将每个不同的数据和总和放在不同的列中。经过大量测试后,我得到了这个查询,但它太慢太大,而且无法检索所有单元:

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
)上显示的单元的数据,并且当单元中没有数据时,不显示其余数据

我认为应该有更好的方法来面对这个问题。

试试这个-

;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

谢谢,但是这个查询与我的查询需要相同的时间来检索数据,并且仍然存在不获取某些单位的问题(检索与我的查询相同的结果)