mysql有计数总和的子句

时间:2015-02-20 13:33:12

标签: mysql sql

我有以下查询给出以下结果

SELECT ttable.* 
FROM  ( SELECT 
            `STATUS`, 
            `TELCOID`,                
            COUNT(*) smsCount                 
        FROM `smsout` 
        WHERE `STATUS`  = 'Send'        
            AND (RECEIVEDTIME BETWEEN DATE_SUB(NOW(), INTERVAL 1000000 MINUTE) AND NOW())
        GROUP BY  `STATUS` , `TELCOID`                                 
   ) ttable 
#having Sum(smscount) > 2500 ;

STATUS  TELCOID smsCount
send    -3      2
send    -1      2487
send    158     233
send    162     16

我需要的是添加一个where / having子句,它将检查sum(smscount)> 2500然后返回结果集其他明智的没有 我可以在此查询中更改什么来实现它。在当前结果中,2 + 2487 + 233 + 16的总和大于2500,因此它不会返回任何东西。如果不是2500我将3000放置,那么结果集将返回

3 个答案:

答案 0 :(得分:0)

您需要运行两个查询或使用变量。我认为这可能有用:

SELECT status, telcoid, smscount
FROM  (SELECT `STATUS`, `TELCOID`, COUNT(*) as smsCount,
              (@s := @s + COUNT(*)) as cumesum              
        FROM `smsout` CROSS JOIN (SELECT @s := 0) vars
        WHERE `STATUS`  = 'Send' AND       
              RECEIVEDTIME BETWEEN DATE_SUB(NOW(), INTERVAL 1000000 MINUTEAND NOW())
        GROUP BY `STATUS` , `TELCOID`                                 
     ) ttable 
WHERE @s > 2500;

有时变量在聚合方面不能正常工作,因此您可能需要额外的子查询层来实现此目的。

编辑:

试试这个版本:

SELECT status, telcoid, smscount
FROM  (SELECT t.*, (@s := @s + COUNT(*)) as cumesum              
       FROM (SELECT `STATUS`, `TELCOID`, COUNT(*) as smsCount
              FROM `smsout`
              WHERE `STATUS`  = 'Send' AND       
                    RECEIVEDTIME BETWEEN DATE_SUB(NOW(), INTERVAL 1000000 MINUTEAND NOW())
              GROUP BY `STATUS` , `TELCOID`                                 
            ) t CROSS JOIN
            (SELECT @s := 0) vars
       ) t
WHERE @s > 2500;

答案 1 :(得分:-1)

smscount是一个总和,因为你写了count(*)smscount

你可以尝试

吗?
SELECT ttable.* 
FROM  ( SELECT 
        `STATUS`, 
        `TELCOID`,                
        COUNT(*) smsCount                 
        FROM `smsout` 
        WHERE `STATUS`  = 'Send'        
            AND (RECEIVEDTIME BETWEEN DATE_SUB(NOW(), INTERVAL 1000000     MINUTE) AND NOW())
        GROUP BY  `STATUS` , `TELCOID`                                 
   ) ttable 
having smscount > 2500 ;

答案 2 :(得分:-2)

SELECT `STATUS`, `TELCOID`, COUNT(*) smsCount
FROM `smsout` 
WHERE `STATUS`  = 'Send'        
AND (RECEIVEDTIME BETWEEN DATE_SUB(NOW(), INTERVAL 1000000 MINUTE) AND NOW())
GROUP BY  `STATUS` , `TELCOID` 
HAVING COUNT(*) > 2500;

子查询不是必需的。