在MySQL中聚合GROUP BY函数中的组

时间:2013-04-04 14:55:08

标签: mysql sql aggregate-functions

我有一个包含网站流量日志信息的数据表

date         ip     country     duration
02/12/2013   *      USA           455
02/13/2013   *      CA           1234
02/14/2013   *      Cambodia       13
02/12/2013   *      USA            12
03/11/2013   *      Korea          11
....

现在我想通过汇总查询来进行汇总/分组,该汇总查询按国家/地区总计访问持续时间,但我想只生产三个组(美国,加拿大,其他人)

并产生这样的理想输出:

  country     sum(durations) 
   USA            123456789
   Canada          55555679
Everyone Else        696969

是否可以在单个查询中执行此操作?

3 个答案:

答案 0 :(得分:2)

您可以使用CASE声明执行此操作:

select (
  case 
    when country in ('USA','Canada') then country 
    else 'Everyone Else' 
   end
) as country_group,
  sum(duration)
from your_table
group by country_group

答案 1 :(得分:1)

select country, sum(duration)
from
(
select date, ip, 
       case 
           when country <> 'USA' and country <> 'Canada' then 'Everyone Else'
           else country
       end country,
       duration
from trafficlog
) subsel
group by country

答案 2 :(得分:1)

这样的东西
SELECT ..
...
GROUP BY
    CASE country
        WHEN 'USA' THEN 'USA'
        WHEN 'Canada' THEN 'Canada'
        ELSE 'Everyone Else'
    END CASE

会做到这一点。脱离我的头顶,所以这可能不会按原样运作。但是MySQL确实接受了group / where / order子句的任意逻辑,因此你可以编写你想要进行分组的任何内容。

另一种选择:

SELECT IF(country NOT IN ('Canada', 'USA'), 'Everyone Else', country) AS country
...
GROUP BY country