2012-10-28 20 views
5

MSSQL Express 2005を使用して日付範囲内で受信した電子メールの数を取得しようとしています。これを数多く管理しましたが、今ではデータをそれに加えたものに分割したい。ここで 日付範囲内のSELECT COUNT

は、私がこれまで持っているものです:私の最後の週に10回以上を郵送アドレスのリストを与える

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

を、私たちはで何が起こったのかを教えてくれる別の列を持っています郵便物。私はこのような何かを達成しようとしている:

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 

私はこれらの線に沿って、結果セットを探しています:私はそれが(OVER使用とは何かを持っているかなり確信している

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

PARTITION BY)節がありますが、私は壁に当たっています。私はActionTakenフィールドが理想的ではないことを認識しますが、私はそれを構築しませんでした!

答えて

2

それは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

あなたはほぼ確実に、今私はそれを参照してくださいので、シンプルに見える何かのために集約関数のまわりで私の頭を取得しようとして一日であったであろうものを私を救いました!ありがとう、それは完全に動作します! – timbstoke

+0

@timbstoke - 喜んで助けてください。 'PIVOT'を使うこともできますが、私は' CASE'メソッドを覚えやすく、より柔軟にする方が好きです。また、関連する列のみをソースとして使用して派生テーブルまたはCTEを使用する場合を除き、「PIVOT」を使用すると、基本表に列を追加すると問合せが破損する可能性があります。 –

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