2016-03-22 13 views
-1

Ich habe 2 Datentabellen muss ich Daten abzufragen vonSQL Count mehrere Spalten basierend

Machine_ID Machine_name 
101   Computer1 
202   Computer2 
303   Computer3 
404   Computer4 

Zweite Tabelle:

Machine_ID Event_ID Event_date 
101  1  03/15/2016 
101  1  03/14/2016 
101  2  03/15/2016 
101  1  03/13/2016 
102  1  03/15/2016 
102  2  03/15/2016 
102  1  03/14/2016 
103  2  03/15/2016 
103  2  03/14/2016 
104  1  03/15/2016 

Ich brauche die Ausgabe der Abfrage in einer Linie zu sein und enthalten Informationen:

Machine_ID, 
Machine_Name, 
Count(Machine_ID) where Event_ID='1' 
Count(Machine_ID) where Event_ID='2' 

Ich habe zahlreiche Möglichkeiten versucht, um die Abfrage zu schreiben, aber bin für die korrekte Syntax ratlos.

Dies funktioniert nicht, aber eine Vorstellung davon, was ich werde:

Select M.Machine_ID, M.Machine_Name, 
count(Machine_ID) where E.Event_ID='1' and Machine_ID='101', 
count(Machine_ID) where E.Event_ID='2' and Machine_ID='101' 
from Machines M 
join Events E on M.Machine_ID = E.Machine_ID 

Die Ausgabe von diesem in den angegebenen Daten basieren soll:

101 Computer1 3 1 
+1

Mögliches Duplikat von [Wie erhält man mehrere Zählungen mit einer SQL-Abfrage?] (Http://stackoverflow.com/questions/12789396/how-to-get-multiple-counts-with-one-sql-query) –

Antwort

0

Try this:

SELECT 
    M.Machine_ID, 
    M.Machine_Name, 
    COUNT(CASE WHEN E.Event_ID='1' THEN 1 ELSE NULL END) AS Event1, 
    COUNT(CASE WHEN E.Event_ID='2' THEN 1 ELSE NULL END) AS Event2 
FROM Machines M 
    JOIN Events E 
    ON M.Machine_ID = E.Machine_ID 
GROUP BY M.Machine_ID, M.Machine_Name 
+0

Sie müssen ELSE NULL nicht angeben. Dies ist das Standardverhalten für die CASE-Anweisung. –

+0

Prozedural Programmierer manchmal wegen aller Codierungsstandards und "else" ausflippen. Ich schließe mich oft ein, um sie glücklich zu machen, obwohl ich es lieber die meiste Zeit weglassen würde. – shawnt00

+0

@ConsiderMe Da es nichts schadet, ziehe ich es vor, möglichst explizit zu sein, anstatt irgendwelche Entscheidungen dem Computer zu überlassen. Computer machen dumme Dinge in Abwesenheit von Anweisungen. Aber es ist nur eine persönliche Vorliebe/Meinung. – morgb

-1

eine bedingte Aggregation Verwendung:

SELECT 
    M.Machine_ID, 
    M.Machine_Name, 
    SUM(CASE WHEN E.Event_ID = '1' THEN 1 END) AS Event1_cnt, 
    SUM(CASE WHEN E.Event_ID = '2' THEN 1 END) AS Event2_cnt 
FROM 
    Machines M 
    JOIN Events E 
     ON M.Machine_ID = E.Machine_ID 
GROUP BY 
    M.Machine_ID, M.Machine_Name 

Wenn Sie die Ausgabe nur auf einer Maschine ID (zum Beispiel: 101) begrenzen wollen fügen Sie eine folgende Zeile vor GROUP BY:

WHERE M.Machine_ID = '101' 

Auch scheint es wie eine schlechte Idee ID als zu speichern Zeichenfolge. Erwägen Sie, den Datentyp in Integer oder Ähnliches zu ändern.

+0

Kann die Person, die diese Antwort abgelehnt hat, einen Kommentar hinzufügen, warum diese Aktion ausgeführt wurde? –

Verwandte Themen