2012-10-28 18 views
5

Sto cercando di ottenere un conteggio delle email ricevute durante un intervallo di date utilizzando MSSQL Express 2005. Ho gestito così tanto, ma ora voglio dividere i dati in ciò che è stato fatto con esso .SELECT COUNT nell'intervallo di date

Ecco quello che ho finora:

SELECT EmailAddress, COUNT(EmailAddress) 
    FROM mails 
    WHERE ReceivedTime >= DATEADD(DAY, -7, GETDATE()) 
    GROUP BY EmailAddress 
    HAVING COUNT(EmailAddress) > 10 

Questo mi dà un elenco di indirizzi che spediti più di 10 volte nel corso dell'ultima settimana, ma abbiamo un'altra colonna che ci dice cosa è successo con il la posta. Io sto cercando di realizzare qualcosa di simile:

SELECT EmailAddress, 
    COUNT(ActionTaken WHERE ActionTaken="Deleted") AS Deleted, 
    COUNT(ActionTaken WHERE ActionTaken="Replied") AS Replied, 
    COUNT(ActionTaken WHERE ActionTaken="Read") AS Read, 
    COUNT(EmailAddress) AS Total 
    FROM mails 
    WHERE ReceivedTime >= DATEADD(DAY, -7, GETDATE()) 
    GROUP BY EmailAddress 
    HAVING COUNT(EmailAddress) > 10 

Sto cercando un set di risultati in questo senso:

EmailAddress  | Deleted | Replied | Read | Total 
--------------------------------------------------- 
[email protected] | 4  | 5  | 3 | 12 
[email protected] | 2  | 6  | 3 | 11 

Sono abbastanza sicuro che abbia qualcosa a che fare con l'utilizzo di OVER (PARTITION BY) clausole, ma ho colpito un muro. Mi rendo conto che il campo ActionTaken non è l'ideale, ma non l'ho costruito io!

risposta

2

Utilizzare le virgolette singole per le stringhe letterali in modo che funzioni indipendentemente dalle impostazioni QUOTED_IDENTIFIER.

SELECT EmailAddress, 
     Sum(CASE WHEN ActionTaken = 'Deleted' THEN 1 ELSE 0 END) AS Deleted, 
     Sum(CASE WHEN ActionTaken = 'Replied' THEN 1 ELSE 0 END) AS Replied, 
     Sum(CASE WHEN ActionTaken = 'Read' THEN 1 ELSE 0 END) AS [Read], 
     Count(EmailAddress) AS Total 
FROM mails 
WHERE ReceivedTime >= Dateadd(DAY, -7, Getdate()) 
GROUP BY EmailAddress 
HAVING Count(EmailAddress) > 10 
+0

Hai solo mi ha salvato quello che sarebbe quasi certamente stato un giorno intero cercando di ottenere la mia testa intorno le funzioni di aggregazione per il bene di qualcosa che sembra così semplice ora lo vedo! Grazie, funziona perfettamente! – timbstoke

+0

@timbstoke - Felice di aiutare. Puoi anche usare 'PIVOT', ma preferisco il metodo' CASE' come più facile da ricordare e più flessibile. Inoltre con 'PIVOT' l'aggiunta di ulteriori colonne alla tabella di base può interrompere la query a meno che non si prenda cura di utilizzare una tabella derivata o CTE con solo le colonne rilevanti come origine. –

1
SELECT EmailAddress, 
     COUNT(CASE WHEN ActionTaken = 'Deleted' THEN ActionTaken END) AS Deleted, 
     COUNT(CASE WHEN ActionTaken = 'Replied' THEN ActionTaken END) AS Replied, 
     COUNT(CASE WHEN ActionTaken = 'Read' THEN ActionTaken END) AS [Read], 
     COUNT(EmailAddress) AS Total 
FROM mails 
WHERE ReceivedTime >= DATEADD(DAY, -7, GETDATE()) 
GROUP BY EmailAddress 
HAVING COUNT(EmailAddress) > 10 
Problemi correlati