2016-05-17 10 views
4

SQLをかなり新しくしていて、やや複雑なSQLクエリの最後のステップで問題が発生しています。私はテーブルの何回目かを数えたいので、2つの異なる値が1つ以上の行に現れます。SQLテーブルで2つの異なる値が2つの行に表示される回数

私の具体的なシナリオは、自分のテーブルにもメッセージ/警告がシステムから格納されているということです。これらのアラートは、応答が必要な複数のユーザーに送信されます。私は各アラートに何人の受信者が応答したかをカウントしたいと思います。

私はこれで私はに引っかかっています部分に私のクエリを下に編集した:

このクエリは、各アラートがそれで、各受信者に元のメッセージから含めていませんどのように多くのメッセージを示して
SELECT DISTINCT AlertID, count(RecipientID) - count(Distinct RecipientID) as Replies, 
FROM [myDB].[dbo].[Alerts] 

システム。この問題は、誰かが1回のアラートに2回反応した場合、1にアポストした2つの応答としてカウントされます(これが私の望むものです)。

私は、各DISTINCT AlertIDをカウントし、DISTINCT受信者IDが1行以上のAlertIDで何回表示されるかによってこれを行うことができると考えました。誰かが2回答えたかどうかは関係ありません。なぜなら、1つ以上の応答がある限り、それは1つの応答として数えられるからです。私はこれを動作させるのに問題があります。私のデータは、このようになります

RecipientID MsgContents  SentBy  AlertID 
12345  Msg1    mySystem  11111 
98765  Msg1    MySystem  11111 
12345  1st Reply to Msg1 John Doe  11111 
12345  2nd Reply to Msg1 John Doe  11111 
98765  reply to Msg1  Mike Smith 11111 
12345  Msg3    mySystem  33333 
12345  Reply to Msg3  John Doe  33333 
12345  Msg2    mySystem  99999 

私がすべきクエリの出力をしたいと思います:

AlertID  Replies 
11111   2 
33333   1 
99999   0 

私はthis answerが役立つだろうと思ったが、それがために仕事を得ることができませんでした私。私はまた、システムが大量のデータを扱うので、可能ならば1つのクエリでそれを保持したいと思います。これが最も簡単な方法でない場合は、私はすべての提案に開放されています。

ご協力いただければ幸いです。

+0

とは対照的に、2行目は、実際の受信者のレコードを取得しますおそらく 'mySystem'によって送信されたレコードは数えてはならないと言及するべきです。 – Ash

答えて

3

あなたはCOUNT内部CASE式を使用してこれを行うことができます。

SELECT 
    AlertID, 
    Replies = COUNT(DISTINCT CASE WHEN SentBy <> 'mySystem' THEN RecepientID END) 
FROM alerts 
GROUP BY AlertID 

ONLINE DEMO

1

group byを使用する場合は、最初にselect distinctを使用しないでください。

これはあなたが望むように見える結果を生成:

SELECT AlertID, (count(Distinct RecipientID) - 1) as Replies 
FROM [myDB].[dbo].[Alerts] 
GROUP BY AlertId; 

あなたが実際に必要になることがあります。

SELECT AlertID, count(Distinct case when sentBy <> 'mySystem' then RecipientID) as Replies 
FROM [myDB].[dbo].[Alerts] 
GROUP BY AlertId; 
0
select AlertId, count(RecipientId) as Replies group by AlertId 
from (select * from Alerts where SentBy <> 'mySystem') 

--The最初の行は、各アラート

のレコードを取得します - あなたはシステムレコード

関連する問題