0

一部の 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
4

1 に答える 1

7

試す

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(*) 全体を再コピーするのではなく、序数の列の位置を尊重します...列が 2 つしかないため、問題ありません...

于 2012-01-26T00:56:13.247 に答える