2017-03-10 3 views
0

Ich habe Schwierigkeiten, diese Abfrage zu erhalten, um die korrekten Daten anzuzeigen.Beitreten wird nicht richtig gefiltert

SELECT a.ReportDate 
    ,a.ClientName 
    ,count(a.ADUsername) AS UserCount 
    ,sum(b.ShareData + b.UserData) AS DataUsage 
    ,sum(d.UsedSpace) AS SQLUsage 
FROM TableA AS a 
    JOIN TableB AS b 
     ON a.ClientName = b.ClientName AND a.ReportDate = b.ReportDate 
    JOIN TableC AS c 
     ON a.ClientName = c.ClientName AND b.ClientName = c.ClientName 
    JOIN TableD AS d 
     ON c.SQLInstance = d.ServerInstance AND a.ReportDate = d.ReportDate 
WHERE a.ClientName = @client AND a.ReportDate = @date 
GROUP BY a.ReportDate,a.ClientName 

Die Spalten werden angezeigt, aber die Daten darin sind falsch. Insbesondere die Spalte UserCount, DataUsage und SQLUsage enthält wesentlich größere Zahlen. Um zu wiederholen, was passiert:

TableA enthält eine Liste von Namen und ich brauche eine Zählung dieser Namen für ein bestimmtes Datum.
TabelleB enthält 2 Spalten mit numerischen Daten, die mit demselben Kundennamen und demselben Datum wie in TabelleA übereinstimmen müssen.
TableC sind Informationsdaten für jeden Clientnamen in TabelleA und Tabelle B.
TableD enthält mehr Spalten mit numerischen Daten, die mit dem Instanznamen aus TableC übereinstimmen müssen und mit dem Clientnamen aus TableA und TableB sowie dem Berichtsdatum übereinstimmen.

Jede Hilfe wäre willkommen.

EDIT: Hier sind die Ergebnisse dieser Abfrage:

ReportDate | ClientName | UserCount | DataUsage | SqlUsage 
03/09/2017 | Client | 175 | 125531.00 | 168816.20 

Wenn ich trete auf Tabelle A und B, erhalte ich die richtigen Daten.

SELECT a.ReportDate,a.ClientName 
    ,count(a.ADUsername) AS UserCount 
    ,sum(b.ShareData + b.UserData) AS DataUsage 
FROM TableAs AS a 
    LEFT JOIN TableB AS b 
     ON a.ClientName = b.ClientName 
WHERE a.ClientName = @client AND a.ReportDate = @date 
GROUP BY a.ReportDate,a.ClientName 

Returns:

ReportDate | ClientName | UserCount | DataUsage 
03/09/2017 | Client | 7 | 5021.24 

Dann für SQLUsage die Summe tun

SELECT sum(UsedSpace) 
FROM TableD 
WHERE ServerInstance = @instance AND ReportDate = @date 

Gibt mir 24116.60

All diese Informationen korrekt sind.

+0

Auch wenn es nicht genau richtig ist, @ Psis Antwort ist sicherlich auf dem richtigen Weg. Es ist unwahrscheinlich, dass Sie eine bessere Lösung erhalten, wenn Sie einige Beispieldaten bereitstellen, die das Problem veranschaulichen. –

Antwort

0

Ich glaube, ich sehe, was hier vor sich geht:

Sie möchten einen Bericht für einen bestimmten Client (= Host) erhalten, die mehrere Benutzer hat. Jeder von ihnen erzeugt eine einzelne Zeile in den Tabellen A und B.

Wenn also 5 Benutzer auf diesem Computer sind, wählen Sie ALLE Benutzer aus Tabelle A aus und kreuzen sie mit ALLEN Benutzern in Tabelle B, was insgesamt 25 Kombinationen ergibt (Sie passen nur den clientName und das reportDate an, aber wenn es mehr als 1 Benutzer gibt, multiplizieren sie).

Sie zählen auch den verwendeten Speicherplatz für die gesamte Maschine, aber dieser wird für jeden Benutzer abgerufen, der auf dieser Maschine im Quadrat gefunden wird. Also natürlich ist dieser Wert auch zu groß.

Sie

  • sollte, dass eine Zeile in der Tabelle sicherzustellen wirklich A Spiele nur eine Zeile in Tabelle B
  • sollten sicherstellen, dass Sie den verwendeten Speicherplatz für die Maschine nur einmal (oder zusammenzufassen zählen die Der von einem einzelnen Benutzer aus den Tabellen A und B) verwendete Bereich
  • sollte eine der beiden Bedingungen ON a.ClientName = c.ClientName AND b.ClientName = c.ClientName entfernen, da Sie im ersten Join definieren, dass A.clientName = B.clientName. Sie müssen also nur einen von ihnen mit c vergleichen.clientName (es ist ein mathematisches Axiom, wenn a = b und b = c dann a = c)
+0

Wenn ich einen JOIN auf Tabelle A und B mache, bekomme ich die korrekten Daten. Wenn ich C und D addiere, bricht alles zusammen. – Daryl

+0

Vielleicht möchten Sie Ihr Tabellenschema und einige Beispieldaten veröffentlichen? – Psi

Verwandte Themen