mysql - 对多个组进行分组的 SQL 查询

标签 mysql sql sql-server tsql logparser

我正在解析一些 IIS 服务器日志(使用 LogParser),但我在创建一个查询时遇到了一些麻烦,该查询将为我提供每种类型的浏览器(用户代理)的总计数。

到目前为止,这是我的查询:

SELECT COUNT(*) as totalHits, CS(User-Agent) as browser
FROM E:\Logs\ex111101.log
WHERE (CS(User-Agent) LIKE '%ipad%' 
       OR CS(User-Agent) LIKE '%iphone%' 
       OR CS(User-Agent) LIKE '%blackberry%'
       OR CS(User-Agent) LIKE '%windows cs%'
       OR CS(User-Agent) LIKE '%android%')
AND cs-uri-stem LIKE '%.asp%'
GROUP BY browser
ORDER BY totalHits DESC

这给了我一个我想要的用户代理列表,并给了我每组浏览器的点击数:

Total Hits | Browser
467        | AndroidA 
45         | AndroidB 
23         | BlackberryC
233        | BlackberryD

我想要的是:

Total Hits | Browser 
512        | Android 
256        | Blackberry

其中所有 Android 条目都在通用 Android 行下进行计数和总计。在这种情况下,Android 的总点击量为 467 + 45,Blackberry 为 233 = 33,等等。

从那里我想为每个浏览器提供一个百分比列,这样我就可以用百分比表示总点击量。

感谢任何帮助。谢谢!

*更新

遵循以下建议,但必须进行一些调整才能使其由 LogParser 正确执行。由于某种原因,Log Parser 不喜欢 CASE 语句中的 LIKE 关键字。不过以下工作正常:

select
case strcnt(TO_LOWERCASE(cs(user-agent)),'android') WHEN 1 THEN 'Android' else
case strcnt(TO_LOWERCASE(cs(user-agent)),'ipad') WHEN 1 THEN 'iPad' else
case strcnt(TO_LOWERCASE(cs(user-agent)),'blackberry') WHEN 1 THEN 'Blackberry' else
case strcnt(TO_LOWERCASE(cs(user-agent)),'windows ce') WHEN 1 THEN 'Windows' else
case strcnt(TO_LOWERCASE(cs(user-agent)),'iphone') WHEN 1 THEN 'iPhone' 
ELSE 'Non-Mobile' End End End End End as Browser,
count(*) as TotalHits
from MYLOG
group by Browser
order by TotalHits desc

最佳答案

尝试

select
      case when cs(User-Agent) like "%android%" then "Android"
           when cs(User-Agent) like "%black%" then "Blackberry"
           when cs(User-Agent) like "%windows%" then "Windows"
           when cs(User-Agent) like "%iphone%" then "iPhone"
           else "Other" end as Browser,
      count(*) as TotalHits
   from
      YourTable.logFile
   group by
      Browser
   order by
      TotalHits desc

group by 和 order by 尊重序数列位置,而不是重新复制整个 case/when 和 count(*)... 因为只有两列,没问题...

关于mysql - 对多个组进行分组的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9012613/

相关文章:

java - 没有合适的驱动程序

sql - 将 nvarchar 数据类型转换为日期时间数据类型导致值超出范围

将列合并为一个的 SQL 函数

mysql - 我可以使 mysql 表列不区分大小写吗?

php - 通过搜索栏 php 查询数据库

php - openshift phpmyadmin 重定向循环

sql - 是否可以使用不在分组依据(SQL)中的列获得函数结果?

java - 尽管语句中存在数据,Blob 字段自动设置为 null

php - MySQL 数据库迁移失败

sql - 如何阻止嵌套存储过程的结果显示在顶层?