2013-03-01 61 views
1

我有这个查询,它根据与INNER JOIN链接的一些派生表进行一些计算。MYSQL GROUP BY多个派生表?

目前我有一个WHERE条款,一次只能提取一个id。但是我怎样才能让它列出全部的ID?

我试过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  

我想要做的就是用GROUP BY更换WHERE条款列出所有的ID,或类似,但得到的是工作超出了我的技能水平...任何帮助非常感谢:)

+0

如果您可以提供数据库模式,样本数据和预期结果,那么提供解决方案会更容易,您可以使用SqlFiddle.com。 – Minesh 2013-03-01 12:45:24

回答

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 
+0

实际上有一个问题,现在我已经正确地进行了测试,查询将两个子查询输出分配给每个ID – xgstr 2013-03-01 14:25:41

+0

请参阅上面的编辑 - 感谢Minesh让我朝着正确的方向:) – xgstr 2013-03-01 14:51:21

+0

@xgstr不确定编辑,请说明做了哪些更改。 – Minesh 2013-03-01 17:12:31

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