5

MSSQL Express 2005を使用して、日付範囲内に受信した電子メールの数を取得しようとしています。それだけ管理しましたが、データをそれを使用して行われたものに分割したいと思います。

これが私がこれまでに得たものです:

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

先週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

私はこれらの線に沿った結果セットを探しています:

 EmailAddress     | Deleted | Replied | Read | Total
 ---------------------------------------------------
 user1@domain.com | 4       | 5       | 3    | 12
 user2@domain.com | 2       | 6       | 3    | 11

OVER(PARTITION BY)句の使用と関係があると確信していますが、壁にぶつかりました。ActionTakenフィールドは理想的ではないことに気づきましたが、私はそれを構築しませんでした。

4

2 に答える 2

3

文字列リテラルには一重引用符を使用して、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 
于 2012-10-28T11:56:27.810 に答える
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
于 2012-10-28T12:34:49.103 に答える