2016-07-07 11 views
0

Ich habe wirklich mit dem unten stehenden SQL zu kämpfen. Ich habe so viele verschiedene Dinge ausprobiert, und ich kann keine von ihnen zur Arbeit bekommen.SQL-Anweisung mit linken Joins, Where-Klausel und einer Summe()?

Was ich im Grunde tun müssen, ist LEFT OUTER diese Arbeits SQL-Anweisung JOIN:

SELECT "TABLE1"."Sheet Number", 
     "TABLE1"."ID Number", 
     "TABLE1"."Identification", 
     "TABLE1"."Job Date", 
     "TABLE1"."p2c", 
     "TABLE2"."Range", 
     "TABLE1"."bcr", 
     "TABLE1"."Dataset ID", 
     "TABLE1"."ACC", 
     "TABLE1"."GNC", 
     "TABLE1"."Year", 
     "TABLE1"."Period", 
     "TABLE1"."Week", 
     "TABLE1"."Job_ID" 
FROM  "DATABASE"."dbo"."TABLE2" "TABLE2" LEFT OUTER JOIN "DATABASE"."dbo"."TABLE1" "TABLE1" 
     ON (((("TABLE2"."Contract"="TABLE1"."GNC") 
     AND ("TABLE2"."FromPeriod"="TABLE1"."Period")) 
     AND ("TABLE2"."FromWeek"="TABLE1"."Week")) 
     AND ("TABLE2"."FromYear"="TABLE1"."Year")) 
WHERE "TABLE1"."ACC"='ACCOUNT57' 
     AND "TABLE1"."Dataset ID"=5 
     AND "TABLE1"."bcr"=1 
     AND "TABLE2"."Range"='Week' 
ORDER BY "TABLE1"."Sheet Number" 

mit dieser:

SELECT "SALES"."JobId", 
     "SALES"."Total", 
     SUM("SALES"."Total") AS JOBTOTAL 
FROM "DATABASE"."dbo"."SALES" "SALES" 
GROUP BY "SALES"."JobId" 
ON "SALES"."JobId"="TABLE1"."Job_ID" 

Aber auch die anderen Joins macht mir sehr viel Verwirrung/Frustration beim Versuch, Lösungen zu implementieren, die ich online gefunden habe. Ich habe gelesen, dass es die WHERE- und GROUP BY-Anweisungen nicht gut spielen können ??

Aber ich kann anscheinend keine Lösung finden, die ich online finde, um zu arbeiten. Eine Lösung, die ich ausprobiert habe, sah so aus, als hätte sie die SQL-Anweisung mit SUM() und GROUP BY (meine untere Anweisung) in Klammern eingeschlossen und damit verbunden?

Kann jemand da draußen helfen?

Danke für Ihre Zeit.

+0

Die einfachste war eigentlich die Summe Select in einer abgeleiteten Tabelle Einwickeln und dann nach links, um es Mitglied werden. Und überprüfen Sie, ob das Ergebnis der ersten Abfrage das ist, was Sie erwarten, es ist eine innere Verbindung statt der linken. – dnoeth

+0

Sie verwenden keine Spalten aus Tabelle 2 versuchen Sie, die Ergebnisse von Tabelle 1 durch Tabelle 2 zu begrenzen? – Matt

+0

Ja Tabelle 2 wird nur verwendet, um die Ergebnisse von Tabelle 1 zu begrenzen - es sollte einen inneren Join tbh haben, aber ich habe versucht, dies zum Laufen zu bringen und begann alles und alles zu ändern. Es war auch eine abgeleitete Tabelle, die ich zu implementieren versuchte, aber ich konnte es einfach nicht funktionieren ... – Dark

Antwort

1
SELECT 
    t1.Sheet Number, 
    t1.ID Number, 
    t1.Identification, 
    t1."Job Date", 
    t1.p2c, 
    t1."Range", 
    t1.bcr, 
    t1.Dataset ID, 
    t1.ACC, 
    t1.GNC, 
    t1."Year", 
    t1.Period, 
    t1."Week", 
    t1.Job_ID, 
    SUM(s.Total) AS JOBTOTAL 
FROM  
    dbo.TABLE1 t1 
    LEFT JOIN dbo.Sales s 
     ON t.Job_Id = s.Job_id 
WHERE 
    t1.ACC='ACCOUNT57' 
    AND t1.Dataset ID=5 
    AND t1.bcr=1 
    AND EXISTS (SELECT * 
      FROM 
       dbo.TABLE2 t2 
      WHERE 
       t1.GNC = t2.Contract 
       AND t1.Period = t2.FromPeriod 
       AND t1."Week" = t2.FromWeek 
       AND t1."Year" = t2.FromYear 
       AND t2."Range"='Week') 
GROUP BY 
    t1.Sheet Number, 
    t1.ID Number, 
    t1.Identification, 
    t1."Job Date", 
    t1.p2c, 
    t1."Range", 
    t1.bcr, 
    t1.Dataset ID, 
    t1.ACC, 
    t1.GNC, 
    t1."Year", 
    t1.Period, 
    t1."Week", 
    t1.Job_ID 
ORDER BY 
    t1.Sheet Number 

Sie können es auch tun, auf diese Weise:

SELECT DISTINCT 
    t1.Sheet Number, 
    t1.ID Number, 
    t1.Identification, 
    t1."Job Date", 
    t1.p2c, 
    t1."Range", 
    t1.bcr, 
    t1.Dataset ID, 
    t1.ACC, 
    t1.GNC, 
    t1."Year", 
    t1.Period, 
    t1."Week", 
    t1.Job_ID, 
    s.JOBTOTAL 
FROM  
    dbo.TABLE1 t1 

    INNER JOIN dbo.TABLE2 t2 
    ON t1.GNC = t2.Contract 
    AND t1.Period = t2.FromPeriod 
    AND t1."Week" = t2.FromWeek 
    AND t1."Year" = t2.FromYear 
    AND t2."Range"='Week' 

    LEFT JOIN (SELECT 
       SUM(s.Total) AS JOBTOTAL 
      FROM 
       dbo.Sales s 
      WHERE 
       t.Job_Id = s.Job_id) s 
WHERE 
    t1.ACC='ACCOUNT57' 
    AND t1.Dataset ID=5 
    AND t1.bcr=1 
ORDER BY 
    t1.Sheet Number 
+0

Vielen Dank - nur Problem, das ich jetzt habe, ist, dass die JOBTOTAL Summe bringt 4 Werte zurück - 2 sind für die richtige Menge und 2 sind die korrekte Menge verdoppelt. z.B. job1 = £ 10 job1 = £ 20 job1 = £ 20 job1 = £ 10 – Dark

+0

Tabelle 2 verursacht wahrscheinlich mehr als 1 Zeile, die auf dem Tisch 1 beitreten zurückgegeben wird. Ich nehme an, Tabelle 1 ist eine Eins zu Tabelle 2 viele Beziehung? – Matt

+0

Ja, es bringt eine Zeile für jedes chargable Element zurück Ich wollte das JOBTOTAL Feld, um all dies zusammenzufassen - Es ist in Ordnung, obwohl ich es außerhalb von SQL durch Gruppierung und Verwendung von Minimum() auf dem Feld lösen kann, da es entweder die richtige Menge einbringt oder verdoppeln Sie den korrekten Betrag für jeden Job. Danke für Ihre Hilfe! – Dark