2016-07-07 180 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