SQL-запрос для группировки нескольких групп

Я анализирую некоторые журналы сервера 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. В этом случае Total Hits для Android будет 467 + 45, для Blackberry будет 233 = 33 и т. д.

Оттуда я хотел бы предоставить столбец Percent для каждого браузера, чтобы я мог представить общее количество обращений в процентах.

Любая помощь приветствуется. Спасибо!

*ОБНОВЛЕНИЕ

Следовал приведенному ниже предложению, но ему пришлось внести несколько изменений, чтобы LogParser правильно выполнил его. По какой-то причине Log Parser не понравилось ключевое слово LIKE в операторе CASE. Однако следующее работало нормально:

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

person tresstylez    schedule 26.01.2012    source источник
comment
Ваши данные действительно содержат "AndroidA", "AndroidB", "BlackberryC", "BlackberryD" и т. д.? Или вы упрощаете данные для целей вопроса?   -  person Asaph    schedule 26.01.2012
comment
Просто упрощение. Это различные строки пользовательского агента, основанные на версии или устройстве... но большинство из них содержат похожий идентификатор.   -  person tresstylez    schedule 26.01.2012


Ответы (1)


пытаться

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

Группировка и порядок следования позиции порядкового столбца вместо повторного копирования всего случая/когда и подсчета (*)... Так как есть только два столбца, нет проблем...

person DRapp    schedule 26.01.2012
comment
Поскольку среда выполнения, по-видимому, поддерживает это, я все же рекомендую указывать имена столбцов вместо порядковых индексов, поскольку это может привести к непредвиденному поведению при перемещении столбцов. Переименование столбца, скорее всего, «вежливо» что-то сломает. - person Clockwork-Muse; 26.01.2012
comment
Спасибо, DRapp. Ваш ответ привел меня к правильному синтаксису! Просто переключил синтаксис LIKE на синтаксис strcnt, который в основном делает то же самое. Может быть, это работает для обычных движков SQL, но не для движка LP?? Спасибо! - person tresstylez; 27.01.2012