2013-02-22 3 views
0

У меня есть таблица выглядит следующим образом:SQL - подсчет вхождений в колонке на ДЕНЬ

и я хочу, чтобы подсчитать число вхождений сказать «AB» и «CD» в PAGEURL колонке и GROUP BY DAY (т.е. нет укажите количество вхождений на день, это число равно 1).

ID User Activity PageURL ActDateTime 
1 Me act1  abcd  2013-01-17 19:09:01.040 
2 Me act2  cdab  2013-01-17 19:09:06.613 
3 You act2  xyza  2013-01-30 16:10:50.177 
4 Me act3  xyab  2013-01-30 10:35:09.037 

Я хочу иметь 2 столбца ... 1 для подсчета «ab» и 1 для подсчета «cd».

В приведенном выше примере есть 3 подсчета для «ab», но я буду считать только 2, потому что первые 2 произошли в один и тот же день (так что считайте 1).

Опять же, в столбце PageURUR есть 2 счета для «cd», но я хочу считать только 1, потому что произошел в тот же день.

Кроме того, я хочу сгруппировать по месяцам года i.e. Jan-12, Feb-12, March-12, April-12 ... и т. Д.

Очень понравилась бы помощь и совет. Спасибо!

Это то, что я сделал до сих пор (но он не принимает в счет группировки по DAY)

SELECT USER, 
     department, 
     activity, 
     [MonthYear] = DATENAME(mm, ActDateTime)+ ' - ' + 
            DATENAME(yy, actdatetime), 
     [ab] = sum(case when pageURL like '%ab%' THEN 1 else 0 END), 
     [cd]= sum(CASE WHEN pageURL LIKE '%cd%'THEN 1 ELSE 0 END) 
FROM activityLog 
GROUP BY USER, 
     department, 
     activity, 
     DATENAME(mm, ActDateTime)+ ' - ' + 
     DATENAME(yy, ActDateTime) 
ORDER BY USER, 
     department, 
     activity, 
     DATENAME(mm, ActDateTime)+ ' - ' + DATENAME(yy, ActDateTime) 

ответ

0
SELECT Thing 
     ,COUNT(*) NumDays 
FROM (SELECT LEFT(PageURL, 2) AS Thing 
     ,DateTime 
     FROM table 
     ALL 
     SELECT RIGHT(PageURL, 2) 
      ,DateTime 
     FROM table) UniqueDays 

Это не будет работать из-за ключевых слов вы имеете используемый в вашем вопросе.

В общем, проще использовать фактические имена столбцов/таблиц, чтобы ответ мог их отразить - это позволяет избежать путаницы.

+0

спасибо я буду обновлять имена столбцов! –

2

Это должно работать, чтобы создать отсчеты я думаю:

SELECT 
    cast(ActDateTime as Date) as DateOnly, 
    SUM(CASE WHEN PageUrl Like '%ab%' THEN 1 ELSE 0 END) as ABCount, 
    SUM(CASE WHEN PageUrl Like '%cd%' THEN 1 ELSE 0 END) as CDCount 
FROM Table1 
GROUP BY cast(ActDateTime as Date) 

SQL Fiddle

+0

Не уверен в логике, но что касается конкретной реализации, есть небольшая проблема. 'COUNT' подсчитывает' 0 'так же, как' 1 's. Значит, вы, вероятно, должны либо заменить оба '0' на 'NULL' (или просто удалить предложения 'ELSE'), либо заменить оба' COUNT 'на' SUM'. То есть Возможно, я не уверен, правильны ли условия или критерий группировки или что-то еще, но я вижу, что вы пытаетесь сделать условную агрегацию, и именно там проблема. С помощью COUNT вы должны указать NULL, чтобы опустить подсчет, но если вы предпочитаете делать это с 1 и 0, используйте вместо этого SUM. –

+0

@AndriyM спасибо, ты определенно прав, и я вошел в него без фактического теста, поэтому на этот раз включил скрипт sql. –

0

Первый запрос, чтобы получить отсчеты в день:

SELECT cast(ActDateTime AS Date) AS DateOnly, 
     CASE 
      WHEN SUM(CASE WHEN PageUrl LIKE '%ab%' THEN 1 ELSE 0 END) >=1 THEN 1 
      ELSE 0 
     END AS ABCount, 
     CASE 
      WHEN SUM(CASE WHEN PageUrl LIKE '%cd%' THEN 1 ELSE 0 END) >=1 THEN 1 
      ELSE 0 
     END AS CDCount 
FROM activityLog 
GROUP BY cast(ActDateTime AS Date) 

второй запрос, чтобы получить желаемый результат:

SQLFIDDLEExample

SELECT DATENAME(month, a.ActDateTime)+ ' - ' + DATENAME(yy, a.ActDateTime) 
     ,SUM(a.ABCount) as ABCount 
     ,SUM(a.CDCount) as CDCount 
FROM (SELECT cast(ActDateTime AS Date) AS ActDateTime, 
     CASE 
      WHEN SUM(CASE WHEN PageUrl LIKE '%ab%' THEN 1 ELSE 0 END) >=1 THEN 1 
      ELSE 0 
     END AS ABCount, 
     CASE 
      WHEN SUM(CASE WHEN PageUrl LIKE '%cd%' THEN 1 ELSE 0 END) >=1 THEN 1 
      ELSE 0 
     END AS CDCount 
FROM activityLog 
GROUP BY cast(ActDateTime AS Date))a 
GROUP BY DATENAME(month, a.ActDateTime)+ ' - ' + DATENAME(yy, a.actdatetime) 
ORDER BY DATENAME(month, a.ActDateTime)+ ' - ' + DATENAME(yy, a.actdatetime) 

Результат:

|  COLUMN_0 | ABCOUNT | CDCOUNT | 
-------------------------------------- 
| January - 2013 |  2 |  1 | 
Смежные вопросы