【问题标题】:SQL Join with aggregated columnsSQL Join 与聚合列
【发布时间】:2017-06-23 18:01:21
【问题描述】:

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

右边的第四张表是我需要输出的样子。

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

所以对于第一行,我们可以看到 JobNo 20166-02 用于切割,估计为 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

【问题讨论】:

  • 为什么结果表中的TotalEstHrs 值与OrderRouting 表中的值不同? (即用于取景和分级)
  • 哎呀,这只是一个错字,匆忙整理了这些表格。我已对其进行了更正,以免混淆未来的读者

标签: sql sql-server


【解决方案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%',但我想这只是一个错误,所以我将代码保持不变。

【讨论】:

  • 非常感谢,代码就像一个魅力。我会仔细研究它。 “20040%”只是我当时碰巧在做的工作,没有注意到我的样本表中有一个不同的工作编号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 2023-01-19
  • 2012-03-04
  • 2014-04-09
  • 2021-12-01
相关资源
最近更新 更多