MYSQL GROUP BY多个派生表?

时间:2013-03-01 12:33:09

标签: mysql

我有这个查询,它基于一些与INNER JOIN链接的派生表进行一些计算。

目前我有一个WHERE子句,一次只能输出一个id。但是我如何让它列出所有 ids?

我在不同的地方尝试了GROUP BY,但无法弄明白。

我的查询到目前为止如下:

SELECT 
equipment_id, 
service_duration,
available_duration,
(available_duration / service_duration)*100 AS availability
FROM (
SELECT
SUM(service_end_time - service_start_time) AS service_duration
FROM(   
    SELECT equipment_id, 
    (CASE  
    END) AS service_start_time,
    (CASE  
    END) AS service_end_time
FROM t1 
WHERE equipment_id = 'EX123' 
  )AS A
) AS B
JOIN(
SELECT equipment_id, 
       SUM(available_end_time - available_start_time) AS available_duration
FROM (
    SELECT equipment_id,  
    (CASE 
    END) AS available_start_time,
    (CASE       
    END) AS available_end_time
FROM t2 
WHERE equipment_id = 'EX123'
  ) AS C
) AS D
ON equipment_id=D.equipment_id    

我想要做的是将WHERE子句替换为GROUP BY以列出所有ID或类似内容,但要使其工作超出我的技能水平......任何帮助都非常感谢:)

2 个答案:

答案 0 :(得分:2)

尝试以下:

    SELECT 
    equipment_id, service_duration, available_duration,
    (available_duration / service_duration)*100 AS availability
    FROM 
    (
            SELECT equipment_id,
            SUM(service_end_time - service_start_time) AS service_duration
            FROM
            (   
                    SELECT equipment_id, 
                        (CASE ... END) AS service_start_time,
                        (CASE  ...  END) AS service_end_time
                    FROM t1         
            ) AS A
            GROUP BY equipment_id
    ) AS B
    JOIN
    (
            SELECT equipment_id, 
            SUM(available_end_time - available_start_time) AS available_duration
            FROM 
            (
                SELECT equipment_id,  
                (CASE ... END) AS available_start_time,
                (CASE ... END) AS available_end_time
                FROM t2         
            ) AS C
            GROUP BY equipment_id
    ) AS D
    ON equipment_id=D.equipment_id 

答案 1 :(得分:1)

试试这个(用你的字段名称替换我的字段名称):

SELECT 
    a.emp_id, 
    service_duration,
    available_duration 

FROM 
    (
        SELECT 
            emp_id,
            SUM(service_end_time - service_start_time) AS service_duration

        FROM 
            data 

        GROUP BY 
            emp_id 
    ) a

    JOIN
    (
        SELECT 
            emp_id, 
            SUM(available_end_time - available_start_time) AS available_duration

        FROM 
            data 

        GROUP BY
            emp_id
    ) b 
    ON a.emp_id = b.emp_id 

GROUP BY
    a.emp_id