2012-01-09 51 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