0

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

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

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

4

3 回答 3

3

您可以使用以下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
于 2013-04-04T14:59:23.707 回答
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
于 2013-04-04T14:58:01.510 回答
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
于 2013-04-04T14:58:31.793 回答