2012-01-09 63 views
6

我正在使用SQL Server 2008.如何查询获得最近七天的总计?

我想编写一个查询,该查询给出了给定天数的总活动。具体来说,我想统计过去七天的每日总票数。

我的表看起来像这样:

VoteID --- VoteDate -------------- Vote --- BikeID 

1   2012-01-01 08:24:25  1  1234 
2   2012-01-01 08:24:25  0  5678 
3   2012-01-02 08:24:25  1  1289 
4   2012-01-03 08:24:25  0  1234 
5   2012-01-04 08:24:25  1  5645 
6   2012-01-05 08:24:25  0  1213 
7   2012-01-06 08:24:25  1  1234 
8   2012-01-07 08:24:25  0  1125 

我需要我的结果看起来像这样

VoteDate ---- Total 
2012-01-01 5 
2012-01-02 6 
2012-01-03 7 
2012-01-04 1 
2012-01-05 3 

我的想法是,我必须做这样的事情:

SELECT SUM(CASE WHEN Vote = 1 THEN 1 ELSE 0 END) AS Total 
FROM  Votes 
GROUP BY VoteDate 

此查询不起作用,因为它只计算同时发生(几乎完全)的投票。当然,我只想看看特定的一天。我如何做到这一点?

回答

10

投它作为一个date

SELECT  
    cast(VoteDate as date) as VoteDate, 
    SUM(CASE WHEN Vote = 1 THEN 1 ELSE 0 END) AS Total 
FROM  Votes 
WHERE VoteDate between dateadd(day, -7, GETDATE()) and GETDATE() 
GROUP BY cast(VoteDate as date) 

VoteDate列是一个datetime,但你只是希望它的date部分。最简单的方法是将其转换为date类型。您可以阅读有关SQL Server日期类型here的更多信息。

而且如果您的Vote列是1或0,则只需执行sum(vote) as Total而不是执行case语句。

+2

为了增加Eric的回答,您可能还需要添加一个WHERE子句首先检索数据仅为去年7(或N)天。否则,您将对全套(可能非常大)执行GROUPING操作,然后只获取最后7天(或N天)的汇总数据。 – 2012-01-09 22:17:15

+0

@WebUser - 你是对的!增加:) – Eric 2012-01-09 22:18:40

+0

此外,你可以建议OP改变'CASE当表决= 1然后1 ELSE 0结束'由'投票'或'coalesce(vote,0)' – danihp 2012-01-09 22:20:19