SQL使用聚合列加入

时间:2017-06-23 18:01:21

标签: sql sql-server

好的,我有这3个表(OrderRouting,TimeTicketDet,WorkCntr):

enter image description here

右边的第4个表是我需要输出的样子。

我只需要前两个表中的列,但由于这两个表中的WorkCntr列不匹配,我必须引入WorkCntr表来绑定它们。它是一个多条件连接,其中JobNo和WorkCntr需要匹配每个相应的行。我需要返回OrderRouting表中的每条记录,并且需要将TotEstHrs和ManHrs列相加

所以对于第一行,我们可以看到JobNo 20166-02 for Cutting,估计是2.25小时,总ManHrs是1.15,.75和.25的总和

这是我到目前为止所尝试的内容并没有发挥作用:

SELECT t.JobNo, w.ShortName, SUM(o.TotEstHrs) AS 'Estimated Hours', 
SUM(t.ManHrs) AS 'Man Hours'
FROM TimeTicketDet t LEFT JOIN WorkCntr w ON t.WorkCntr = w.WorkCntr RIGHT 
JOIN OrderRouting o ON t.JobNo = o.JobNo and w.ShortName = o.WorkCntr
WHERE t.JobNo LIKE '20040%'
AND w.ShortName IN ('Cutting', 'Framing', 'Assembly', 'Grinding', 
'Painting', 'Glazing', 'Locknprep', 'Packaging')
GROUP BY t.JobNo, w.ShortName
ORDER BY t.JobNo, w.ShortName;

它返回正确的JobNo,ShortName,ManHrs数量,但OrderRouting中有行丢失且TotEstHrs值错误

我正在使用SQL Server Management Studio

1 个答案:

答案 0 :(得分:1)

我在OrderRouting的行上使用分组重写了下面的查询,假设它的值在表中是唯一的,并使用COALESCE返回零工时,其中作业没有花费时间。以下是查询

SELECT
  o.JobNo,
  o.WorkCntr,
  o.TotEstHrs,
  COALESCE(SUM(t.ManHrs), 0) AS ManHrs
FROM OrderRouting o
JOIN WorkCntr w ON 
  o.WorkCntr = w.ShortName
LEFT JOIN TimeTicketDet t ON 
  o.JobNo = t.JobNo
  AND w.WorkCntr = t.WorkCntr
WHERE 
  o.JobNo LIKE '20040%'
  AND w.ShortName IN ('Cutting', 'Framing', 'Assembly', 'Grinding', 'Painting', 'Glazing', 'Locknprep', 'Packaging')
GROUP BY o.JobNo, o.WorkCntr, o.TotEstHrs
ORDER BY o.JobNo, o.WorkCntr;

我想知道为什么当你的样本数据没有这样的工作时你有o.JobNo LIKE '20040%',但我想这只是一个错误,所以我保持代码不变。