2016-07-07 182 views
0

我真的在努力處理下面的SQL。我嘗試了很多不同的東西,而且我無法讓他們工作。帶有左連接,Where子句和Sum()的SQL語句?

我基本上需要做的是LEFT OUTER JOIN這個工作的SQL語句:

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" 

這一個:

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" 

但是其他的聯接是造成我困惑的一個很大的/嘗試實施我在網上找到的解決方案時感到沮喪。我讀過它可能是WHERE和GROUP BY語句不是很好玩?

但我似乎無法得到任何解決方案,我發現在線工作。我試過的一個解決方案看起來像是用括號內的SUM()和GROUP BY(我的底部語句)包裝了SQL語句並加入了它?

有人能幫忙嗎?

謝謝你的時間。

+0

最簡單的是在實際包裝SUM選擇在派生表,然後離開加入到它。並檢查第一個查詢的結果是否符合您的期望,這是一個Inner連接而不是Left。 – dnoeth

+0

您沒有使用表2中的任何列,您是否試圖通過表2限制表1的結果? – Matt

+0

是表2僅用於限制表1的結果 - 它應該有一個內部連接tbh,但我正忙着試圖使這個工作,並開始改變任何事情和一切。也是它是一個派生表,我試圖實現,但我只是無法得到它的工作... – Dark

回答

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 

你也可以這樣來做:

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

非常感謝您 - 現在唯一的問題是JOBTOTAL總和正在帶回4個值 - 2是正確的數量和2是正確的數額加倍。 例如 job1 =£10 job1 =£20 job1 =£20 job1 =£10 – Dark

+0

表2可能會導致表1連接返回多於1行。我拿它表1是一對一表2多少關係? – Matt

+0

是的,它爲每個可填充項帶回一行,我希望JOBTOTAL字段將所有這些加起來 - 雖然我可以通過在字段上分組和使用minimum()來解決此問題,因爲它可以帶來正確的數量或者爲每項工作加倍正確的金額。謝謝你的幫助! – Dark