2012-10-28 3 views
5

J'essaie d'obtenir le nombre d'e-mails reçus au cours d'une plage de dates à l'aide de MSSQL Express 2005. J'ai géré cela, mais maintenant je veux diviser les données en ce qui a été fait avec .SELECT COUNT dans la plage de dates

Voici ce que j'ai jusqu'à présent:

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

Cela me donne une liste d'adresses qui envoyés par la poste plus de 10 fois la semaine dernière, mais nous avons une autre colonne qui nous dit ce qui est arrivé avec le courrier. Je suis en train de réaliser quelque chose comme ceci:

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 

Je suis à la recherche d'un jeu de résultats le long de ces lignes:

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

Je suis sûr qu'il a quelque chose à voir avec l'aide de plus (PARTITION PAR) clauses, mais j'ai frappé un mur. Je réalise que le champ ActionTaken n'est pas idéal, mais je ne l'ai pas construit!

Répondre

2

Utilisez des guillemets simples pour les chaînes de caractères afin qu'elles fonctionnent indépendamment des paramètres 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

Vous venez de me sauvé ce qui aurait certainement été une journée entière à essayer d'obtenir ma tête autour des fonctions d'agrégation pour le bien de quelque chose qui semble si simple maintenant je le vois! Merci, ça fonctionne parfaitement! – timbstoke

+0

@timbstoke - Content de vous aider. Vous pouvez également utiliser 'PIVOT' mais je préfère la méthode' CASE', plus facile à retenir et plus flexible. De même, avec 'PIVOT', l'ajout de colonnes supplémentaires à la table de base peut interrompre la requête, sauf si vous prenez soin d'utiliser une table dérivée ou un CTE avec uniquement les colonnes pertinentes comme source. –

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