2012-01-26 120 views
0

我正在解析一些IIS服務器日誌(使用LogParser),並且在創建查詢時會遇到一些麻煩,該查詢會給我每種類型的瀏覽器(用戶代理)的聚合計數。將多個組分組的SQL查詢

這是到目前爲止我的查詢:

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 

這givse我用戶代理的列表,像我想要的,給我的命中次數爲每個組瀏覽器:

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

我想要的是這個:

Total Hits | Browser 
512  | Android 
256  | Blackberry 

其中所有Android條目在一般Android行下計數和總計。在這種情況下Android的Total Hits爲467 + 45,黑莓將爲233 = 33等。

從那裏我想爲每個瀏覽器提供百分比列,以便我可以用百分比表示總點擊率。

任何幫助表示讚賞。謝謝!

* UPDATE

其次建議下面卻不得不爲了使一些調整它要由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 
+1

你的數據是否真的包含''AndroidA「',''AndroidB」'''',「BlackberryC」''',BlackberryD「等。或者你是否爲了這個問題簡化了數據? – Asaph

+0

只是簡化。它們是基於版本或設備的各種用戶代理字符串......但大多數都包含類似的標識符。 – tresstylez

回答

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尊重序列的位置,而不是重新複製整個情況/時和count(*)...由於只有兩列,所以沒有問題...

+0

由於執行環境似乎支持它,我仍然推薦提供列名而不是順序標記,因爲如果移動列,這可能會導致意外的行爲。重命名專欄更有可能「禮貌地」破壞某些東西。 –

+0

@ X-Zero,所以改變了... – DRapp

+0

感謝DRapp - 你的回答讓我想到了正確的語法!只是切換LIKE語法的strcnt語法,它基本上做同樣的事情。也許它適用於常規的SQL引擎,但不是LP引擎?謝謝! – tresstylez