SQL-按天统计列中的出现次数

SQL-按天统计列中的出现次数,sql,sql-server,sql-server-2008,group-by,Sql,Sql Server,Sql Server 2008,Group By,我的表格如下: 我想按天计算PageURL和GROUP列中出现的“ab”和“cd”(即,无论一天出现多少次,都算作1) 我想有2列…1列用于“ab”计数,1列用于“cd”计数 在上面的示例中,“ab”有3个计数,但是我只算作2,因为前2个发生在同一天(所以计数为1) 同样,PageURL列中的“cd”有2个计数,但我只想将其计数为1,因为它也发生在同一天 此外,我想按月份和年份分组,即1月12日、2月12日、3月12日、4月12日……等等 非常感谢您的帮助和建议。谢谢大家! 这就是我到目前为止所

我的表格如下:

我想按天计算PageURL和GROUP列中出现的“ab”和“cd”(即,无论一天出现多少次,都算作1)

我想有2列…1列用于“ab”计数,1列用于“cd”计数

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

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

此外,我想按月份和年份分组,即1月12日、2月12日、3月12日、4月12日……等等

非常感谢您的帮助和建议。谢谢大家!

这就是我到目前为止所做的(但它没有考虑按天分组)

因为你在问题中使用了关键词,所以这不会起作用


一般来说,使用实际的列/表名更容易,因此答案可以反映这些-避免混淆。

这应该可以创建您的计数,我认为:

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)

第一次查询以按天获取计数:

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)
获取所需输出的第二个查询:

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 |

不确定逻辑,但对于特定的实现,有一个小问题。A
计数
计数
0
s,以及
1
s。也就是说,您可能应该将
0
s替换为
NULL
s(或者简单地删除
ELSE
子句),或者将
COUNT
s替换为
SUM
s。也就是说,我可能不确定条件、分组标准或其他任何东西是否正确,但我可以看到您正在尝试进行条件聚合,这正是问题所在。对于计数,您应该规定NULL来省略计数,但是如果您更喜欢使用1和0,那么就使用SUM来代替。@AndriyM谢谢,您肯定是对的,我在没有实际测试的情况下输入了它,所以这次也包括了sql小提琴。
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)
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 |