SQL - 按DAY计算列中的出现次数

时间:2013-02-22 05:02:44

标签: sql sql-server sql-server-2008 group-by

我有一张表格如下:

我希望在PageURL和GROUP by DAY列中计算说“ab”和“cd”的出现次数(即无论当天发生多少次,它都计为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”。

在上面的示例中,“ab”有3个计数,但我只计算为2,因为前两个发生在同一天(因此计为1)。

同样,PageURL列中的“cd”有2个计数,但我只想计为1,因为它也在同一天发生。

此外,我想按月 - 分组,即1月12日,2月12日,3月12日,4月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)

3 个答案:

答案 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

答案 1 :(得分:0)

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

由于您在问题中使用了关键词,因此无法正常使用。

通常,使用实际的列/表名称更容易,因此答案可以反映这些 - 它可以避免混淆。

答案 2 :(得分: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 |