2014-03-05 53 views
0

它让我感到困惑..总计左计算似乎不起作用。MySQL别名计算

我想获得总代金券,并获得总使用和总剩余。

请大家帮忙。

SELECT 
(IFNULL(SUM(value), 0)) AS total_voucher, 
(
    SELECT 
    IFNULL(SUM(value), 0)) 
    FROM 
    voucher_history 
    WHERE 
    idUser = 1 AND isUsed = 1 AND DATE(FROM_UNIXTIME(datetime)) = '2014-03-04' 
) AS total_used, 

(total_voucher-total_used) AS total_left 

FROM 
voucher_history 
WHERE 
idUser = 1 AND isUsed = 0 AND DATE(FROM_UNIXTIME(datetime)) <= '2014-03-05' 

回答

3

您可以有条件聚集做到这一点,而不是使用子查询:

SELECT coalesce(SUM(value), 0)) AS total_voucher, 
     sum(case when is_used = 1 then value else 0 end) as total_used, 
     sum(case when is_used = 1 then 0 else value end) as total_left 
FROM voucher_history 
WHERE idUser = 1 AND DATE(FROM_UNIXTIME(datetime)) <= '2014-03-05'; 

你的查询有它正试图在同一select使用列别名(total_vouchertotal_used)问题声明。 SQL不支持这一点。您需要使用子查询来获得该功能。

+0

不会'coalesce(SUM(value),0))'返回0即使只有一个值为NULL? –

+0

@VolkanUlukut。 。 。一点都不。 sum()忽略NULL值。如果所有的值都是NULL,它只会返回0。 –

+0

对不起,您是对的。 –