SQL查询 - 如何在一个查询中构造多个SUM(基于不同的参数)

时间:2012-10-11 16:20:38

标签: mysql sql

请查看下面的表格...是否可以构建一个单个查询,以便能够发送左键 1)计算所有拥有class_id 1的车辆的total_time的总和(不论feature_id)
(结果将是6:35)
2)计算所有具有class_id 1且具有feature_id 2的车辆的total_time的总和(结果将是基于vehicle_id 22和24的5:35)

我能够在两个单独的查询中获得结果,但我希望在一个查询中检索它们......类似于:

SELECT 
    SUM((CASE WHEN (VEHICLE_TABLE.class_id = 1) then LOG_TABLE.total_time else 0 end)) **AS TOTAL_ALL**,
    ...here goes statement for 2)... AS TOTAL_DIESEL...
FROM LOG_TABLE, VEHICLE_TABLE .....
WHERE VEHICLE_TABLE.vehicle_id = LOG_TABLE.vehicle_id ......


表1:LOG_TABLE (vehicle_id不是唯一的)
vehicle_id | TOTAL_TIME
-------------- | --------------
22 2:00
22 0:30
23 1:00
24 2:20
24 0:45

表2:VEHICLE_TABLE (vehicle_id是唯一的)
vehicle_id |
类标识码 -------------- | --------------
22个1
23个3
24 1

表3:VEHICLE_FEATURES_TABLE (vehicle_id不是唯一的,但feature_id对于每个vehicle_id是唯一的)
vehicle_id | FEATURE_ID
-------------- | --------------
22个1
22个2
23个1
23个2
23个6
24个2
24个6

2 个答案:

答案 0 :(得分:4)

SELECT  SUM(lt.total_time) AS TOTAL_ALL,
        SUM(CASE WHEN (vft.feature_id IS NOT NULL) then LOG_TABLE.total_time else 0 end) AS FEATURE_TOTAL

FROM    VEHICLE_TABLE vt

        JOIN LOG_TABLE lt
        ON vt.vehicle_id = lt.vehicle_id

        LEFT JOIN VEHICLE_FEATURES_TABLE vft
        ON vt.vehicle_id = vft.vehicle_id AND vft.feature_id = 2

WHERE   vt.class_id = 1

答案 1 :(得分:0)

似乎将两者都放在一个查询中没有多大意义,除非你想要将结果放在一起 如果是这样,只需在两个查询之间添加一个UNION。

如果你想在同一行中同时使用这两个值,请尝试以下方法:

SELECT (SELECT Sum(X) 
        FROM   TBL 
        WHERE  CLASS_ID = 1)       AS CLS_id1, 
       (SELECT Sum(X) 
        FROM   TBL 
        WHERE  CLASS_ID = 1 
               AND FEATURE_ID = 2) AS CLS_id1_FTR_ID2