2013-03-01 56 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