2012-01-26 2 views
0

J'analyse certains journaux de serveur IIS (avec LogParser) et j'ai un peu de mal à créer une requête qui me donnera le nombre total de chaque type de navigateur (agent utilisateur).Requête SQL pour regrouper plusieurs groupes

Voici ma requête à ce jour:

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 

Cela me givse une liste des agents utilisateurs comme je veux, et me donne un nombre de succès pour chaque groupe de navigateur:

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

Ce que je veux est CE:

Total Hits | Browser 
512  | Android 
256  | Blackberry 

Où Toutes les entrées Android sont comptées et totalisées sous une ligne Android générique. De là, Total Hits pour Android serait 467 + 45, Blackberry serait 233 = 33, etc.

De là, je voudrais fournir une colonne Percent pour chaque navigateur afin que je puisse représenter le total des hits en pourcentage.

Toute aide est appréciée. Merci!

* MISE À JOUR

a suivi la suggestion ci-dessous, mais a dû faire quelques ajustements afin qu'il soit exécuté correctement par LogParser. Pour une raison quelconque, Log Parser n'a pas aimé le mot-clé LIKE dans l'instruction CASE. Ce qui suit a bien fonctionné si:

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

Vos données contiennent-elles vraiment '" AndroidA ",' 'AndroidB" ',' "BlackberryC" ',' "BlackberryD" ', etc.? Ou simplifiez-vous les données pour les besoins de la question? – Asaph

+0

Simplifier simplement. Ils sont une variété de chaînes d'agent utilisateur basées sur la version ou le périphérique ... mais la plupart contiennent un identifiant similaire. – tresstylez

Répondre

7

essayer

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 

Le groupe par ordre et par le respect de la position de la colonne ordinale au lieu de recopier l'ensemble du dossier/quand et compte (*) ... Comme il n'y a que deux colonnes, pas de problème ...

+0

Comme l'environnement d'exécution semble le supporter, je recommande toujours de fournir les noms des colonnes, au lieu des indices ordinaux, car cela peut provoquer un comportement imprévu si les colonnes sont déplacées. Renommer une colonne est plus susceptible de casser «poliment» quelque chose. –

+0

@ X-Zero, donc changé ... – DRapp

+0

Merci DRapp - Votre réponse m'a conduit à la bonne syntaxe! Juste changé la syntaxe LIKE pour la syntaxe strcnt qui fait essentiellement la même chose. Peut-être que cela fonctionne pour les moteurs SQL réguliers, mais pas le moteur LP? Merci! – tresstylez

Questions connexes