繁体   English   中英

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

[英]SQL - count occurrences in a column by DAY

我有一张表如下:

我想在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)

这应该可以创造你的计数我认为:

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小提琴

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

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

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

第一个查询按天获取计数:

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 |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM