2012-01-09 15 views
6

Sto utilizzando SQL Server 2008.Come eseguire una query per ottenere i totali per gli ultimi sette giorni?

Voglio scrivere una query che mi dà un'attività totale per un numero di giorni determinati. Nello specifico, voglio contare i voti totali al giorno negli ultimi sette giorni.

Il mio tavolo si presenta così:

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 

Ho bisogno i miei risultati a guardare come questo

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

Il mio pensiero è che devo fare qualcosa di simile:

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

Questa query non funziona perché conta solo i voti che si sono verificati (quasi esattamente) allo stesso tempo. Certo, voglio guardare solo in un giorno specifico. Come faccio a far succedere questo?

risposta

10

Fusioni come un 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) 

La colonna VoteDate è un datetime, ma si vuole solo la parte date di esso. Il modo più semplice per farlo è lanciarlo come un tipo date. È possibile leggere ulteriori informazioni sui tipi di data di SQL Server here.

E se la colonna Vote è 1 o 0, è sufficiente eseguire sum(vote) as Total anziché fare l'istruzione case.

+2

Per aggiungere alla risposta di Eric, è anche possibile aggiungere una clausola WHERE per recuperare prima i dati per solo lo scorso 7 (o N) giorni. In caso contrario, si eseguirà l'operazione di raggruppamento sul set completo (che potrebbe essere molto grande) e quindi si otterranno solo gli ultimi 7 (o N) giorni di dati aggregati. –

+0

@WebUser - Hai ragione! Aggiunto :) – Eric

+0

Inoltre, puoi suggerire a OP che cambia 'CASE WHEN Vote = 1 THEN 1 ELSE 0 END'by' Vote' o'' coalesce (vote, 0)' – danihp

3
SELECT SUM(Vote) As Total, YEAR(VoteDate),Month(VoteDate),Day(VoteDate) 
FROM Votes 
Group By YEAR(VoteDate),Month(VoteDate),Day(VoteDate) 

Some SQL Server functions che potrebbero interessare

Some MySQL functions che potrebbero interessare

Problemi correlati