2016-05-20 11 views
0

Ich habe derzeit eine Abfrage, die in eine Inventory-Tabelle (von Servern) ausgeht, welche "Developer" filtern und eine Liste von verschiedenen Benutzern aus einer Audit- verwandte Tabelle. Im Wesentlichen versuchen, herauszufinden, wer Zugriff auf Entwicklungsserver in diesem bestimmten Inventar hat.SQL Server: Inventory Issue (mit Unterabfrage)

Alles funktionierte, bis ich die zweite Zeile hinzugefügt, die ich weiter unten im Code auf Kommentar:

select distinct tAudit.[USER_ID] 
     --, count(tAudit.[USER_ID]) AS [USER_COUNT] 
from table_audit as tAudit 
where tAudit.inst_name IN (
     SELECT (SUBSTRING([Computer Name],0,CHARINDEX('.',[Computer Name],0))) AS INST_NAME 
     FROM table_server_inventory 
     WHERE [SQL Server Edition] = 'Developer' 
     ) 
order by tAudit.user_id asc 

Also, die Frage ist: Wie kann ich zählen, wie oft ein bestimmter Benutzer angezeigt wird? Gibt es einen Konflikt mit der Tatsache, dass ich distinct verwende? Es gibt eine weitere Frage, die ich gestellt habe, nur um zu sehen, ob ich auf dem richtigen Weg bin. Dies ist ein Beispiel:

select tAudit.[USER_ID] 
     , count(tAudit.[USER_ID]) AS [USER_COUNT] 
from table_audit as tAudit 
where tAudit.user_id IN ('user_001', 'user_009', 'user_199', 'user_222') 
group by tAudit.user_id 

Und es sah so etwas wie diese:

USER_ID  USER_COUNT 
user_001 5 
user_009 32 
user_199 14 
user_222 8 

Idealfall, wenn die primäre Abfrage funktioniert es oben wie das Beispiel aussehen wird, nur mit Dutzenden mehr Ergebnissen.

HINWEIS: Die Tabelle_audit ist tatsächlich sehr groß und listet Server und Benutzer jedes Mal auf. Beispiel:

COMPUTER_NAME USER_ID 
serverAA  user_001 
serverAA  user_009 
serverAA  user_199 
serverAA  user_222 
serverBB  user_001 
serverBB  user_009 
serverCC  user_001 
serverCC  user_199 
serverCC  user_222 
+0

Ihre zweite Abfrage ist der richtige Weg zu gehen. COUNT ist eine Aggregatfunktion und erfordert die GROUP BY-Klausel, die in Ihrer ersten Abfrage fehlt. – squillman

+0

Ich habe versucht, die GROUP BY-Klausel für die erste Abfrage hinzuzufügen, und meine Logik und Platzierung muss deaktiviert sein. Ich würde nur alle Benutzer manuell wie in der zweiten Abfrage auflisten, aber es gibt fast 200 von ihnen. Plus die Liste ist ein bisschen dynamisch - es kann sich in einer Woche ändern. – Erik

+0

GROUP BY geht nach WHERE und vor ORDER BY. Können Sie die erste Abfrage mit der GROUP BY, die Sie versucht haben, veröffentlichen? – squillman

Antwort

2

Sie wollen einfach nur eine GROUP BY Abfrage, nicht SELECT DISTINCT:

select tAudit.[USER_ID], count(tAudit.[USER_ID]) AS [USER_COUNT] 
from table_audit as tAudit 
where tAudit.inst_name IN (
     SELECT (SUBSTRING([Computer Name],0,CHARINDEX('.',[Computer Name],0))) AS INST_NAME 
     FROM table_server_inventory 
     WHERE [SQL Server Edition] = 'Developer' 
     ) 
group by tAudit.[USER_ID] 
order by tAudit.user_id asc 
+0

Das ist auf dem richtigen Weg! Und Ihre Erwähnung von GROUP BY und nicht die Verwendung von SELECT DISTINCT macht Sinn. Die Zahlen, die für [USER_COUNT] abgerufen werden, sind jedoch, wie oft dieser bestimmte Benutzer in der Summe von Table_audit angezeigt wird, nicht, wie oft die Ergebnisse nur für den "Entwickler" angezeigt werden. Wie ändere ich das für diese bestimmte Bedingung? – Erik

+1

@Erik. . . Wegen der 'where'-Klausel sollte dies nur Zeilen zählen, bei denen der Benutzer als Entwickler markiert ist. –