[英]mysql having clause on sum of count
我有以下查詢,給出以下結果
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,那么結果集將返回
您需要運行兩個查詢或使用變量。 我認為這可能有效:
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;
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 ;
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;
子查詢應該不是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.