2016-05-17 11 views
4

Ich bin ziemlich neu in SQL und bin einige Probleme mit dem letzten Schritt in einer etwas komplizierten SQL-Abfrage mit. Ich möchte zählen, wie oft in der Tabelle zwei unterschiedliche Werte in mehr als einer Zeile erscheinen.Count Anzahl der Male, 2 verschiedene Werte erscheinen in mehr als 1 Zeile in SQL Tabelle

Mein spezielles Szenario ist, dass meine Tabelle speichert Nachrichten/Alerts zu und von einem System. Diese Warnungen werden an mehrere Personen gesendet, die eine Antwort benötigen. Ich möchte zählen, wie viele der Empfänger auf jede Warnung reagiert haben.

Ich habe meine Anfrage an den Teil bearbeitet bis ich stecke, was das ist:

SELECT DISTINCT AlertID, count(RecipientID) - count(Distinct RecipientID) as Replies, 
FROM [myDB].[dbo].[Alerts] 

Diese Abfrage zeigt, wie viele Nachrichten jeder Alarm in ihm, nicht an jeden Empfänger der ursprünglichen Nachricht einschließlich von das System. Das Problem dabei ist, dass, wenn jemand zweimal auf einen einzigen Alarm reagiert, als zwei Antworten gezählt als 1 apposed (das ist, was ich will).

Ich dachte, ich könnte dies tun, indem jede einzelne alertId zählen und wie oft eine ID DISTINCT Empfänger wird mit der alertId in mehr als 1 Zeile. Es würde keine Rolle, ob jemand zweimal reagiert, denn solange es mehr als einer ist es als eine einzige Antwort gezählt wird. Ich habe Probleme, das zum Laufen zu bringen.

Meine Daten sieht wie folgt aus:

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 

ich die Ausgabe der Abfrage sein möchte:

AlertID  Replies 
11111   2 
33333   1 
99999   0 

Ich dachte this answer würde helfen, aber es könnte nicht an die Arbeit mich. Ich möchte es auch möglichst in einer Abfrage behalten, da das System mit großen Datenmengen zu tun haben wird. Wenn dies nicht der einfachste Weg ist, bin ich offen für alle Vorschläge.

Jede Hilfe würde sehr geschätzt werden.

+0

Sie sollte wahrscheinlich erwähnen, dass von 'mySystem' gesendete Datensätze nicht zählen sollten. – Ash

Antwort

3

Sie können dies tun, um eine CASE Ausdruck in COUNT verwenden.

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

ONLINE DEMO

1

Zuerst nicht select distinct verwenden, wenn Sie group by verwendet werden soll.

Dann erzeugt diese die Ergebnisse, die Sie scheinen zu wollen:

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

Das könnte dir eigentlich wollen:

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') 

--Das erste Zeile erhält Datensätze für jeden Alarm

- Die zweite Zeile erhält Datensätze für die tatsächlichen Empfänger zu Systemaufzeichnungen Gegensatz

Verwandte Themen