我有以下查询给出以下结果
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放置,那么结果集将返回
答案 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;
子查询不是必需的。