SQL-按天统计列中的出现次数
我的表格如下: 我想按天计算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日……等等 非常感谢您的帮助和建议。谢谢大家! 这就是我到目前为止所做的(但它没有考虑按天分组) 因为你在问题中使用了关键词,所以这不会起作用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日……等等 非常感谢您的帮助和建议。谢谢大家! 这就是我到目前为止所
一般来说,使用实际的列/表名更容易,因此答案可以反映这些-避免混淆。这应该可以创建您的计数,我认为:
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 |