使用多个联接时,如何调整左联接和子查询以修复错误的SUMS

时间:2019-01-30 21:01:02

标签: sql sql-server

我无法在查询中获得正确的汇总结果。我试图按人员,按工作类型按日期汇总所有结果。当我全部运行查询时,我的SUM结果是天文数字。

我正在使用的表和字段是:运算符(OprExtID)和vwProductionDataForTouchReporting(Opr,Extract)。请注意,我删除了允许临时“按工作类型”分组的表/字段和联接,因为这些联接导致了我的高总人数。

在我重新添加这些联接之前,我认为我需要使用子查询来总结我的结果,但是在尝试时会遇到错误。

我收到“'。'附近的语法错误”。错误。关于我在做什么错的任何想法。

这是我当前的查询:

SELECT  CONCAT(OP.OprExtID,'_CSIMAGS') AS Processor, Convert(VARCHAR(8), VT.StartDateTime, 112) AS [Processed Date], VT.Extract AS [Completed]
FROM dbo.Operators OP
INNER JOIN (SELECT OP.Operator, SUM(dbo.VT.Extract) as Completed
FROM VT GROUP BY VT.OPR) dbo.vwProductionDataForTouchReporting VT
ON OP.Operator = VT.Opr
GROUP BY VT.EXTRACT, CONCAT(OP.OprExtID,'_CSIMAGS'), Convert(VARCHAR(8), VT.StartDateTime, 112)

作为一个例子:使用以下结果,我希望该查询为我提供以下结果:

表运算符示例: OprExtID 0012385

示例表(视图)vwProductionDataForTouchReporting StartDateTime,Opr,提取 2019-01-03,0012385,15 2019-01-03,0012385,87 2019-01-04,0012385,12 2019-01-04,0012385,7

查询结果: 处理日期,处理器,已完成 2019-01-03,0012385,102 2019-01-04,0012385,19

关于我在这里缺少什么的任何提示?

2 个答案:

答案 0 :(得分:0)

我不确定您的联接是否正确,您编写它的方式(或者我可能误解了您在这里试图做的事情)。我会这样写:

FROM dbo.Operators AS OP
INNER JOIN dbo.vwProductionDataForTouchReporting VT
 ON (OP.Operator = VT.Opr)
 INNER JOIN dbo.DataInput DI
 ON (VT.JobID = DI.JobID)
 INNER JOIN dbo.jobs JO
 ON (DI.JobID = JO.ID)
 INNER JOIN dbo.Machines MA
 ON (DI.MachNo = MA.MachNo)
 INNER JOIN dbo.JobTypes JT
 ON (DI.JobTypeID = JT.JobTypeID)

这通常是我看到联接被编码的方式:

FROM dbo.Operators AS OP
INNER JOIN (SELECT top 1 Opr from dbo.vwProductionDataForTouchReporting) VT
 ON (OP.Operator = VT.Opr)
 INNER JOIN dbo.DataInput DI
 ON (VT.JobID = DI.JobID)
 INNER JOIN dbo.jobs JO
 ON (DI.JobID = JO.ID)
 INNER JOIN dbo.Machines MA
 ON (DI.MachNo = MA.MachNo)
 INNER JOIN dbo.JobTypes JT
 ON (DI.JobTypeID = JT.JobTypeID)

此外,如果您实际上要获取重复项,则可以针对聚合表运行查询(几种方法可以执行此操作,但是您可以从字面上将选择内容替换为表引用):

Assert.AreEqual(account.Owner.FirstName, account2.Owner.FirstName);
Assert.AreEqual(account.Owner.LastName, account2.Owner.LastName);
Assert.AreEqual(account.Balance, account2.Balance);

答案 1 :(得分:0)

您遇到的问题与要加入的表数无关。问题是,在一个或多个表中,基于您指定的JOIN标准,记录比您想象的要多。

我们没有您的表模式或样本数据,因此您不太可能在此处获得具体答案,但是您可以自己深入了解。

仅从一个表开始并获得行数:

SELECT 
  COUNT(*) 
FROM dbo.Operators AS OP
--INNER JOIN
--    dbo.vwProductionDataForTouchReporting AS VT
--      ON
--      OP.Operator = VT.Opr
--INNER JOIN
--    dbo.DataInput AS DI
--      ON
--      VT.JobID = DI.JobID
--INNER JOIN
--    dbo.jobs AS JO
--      ON
--      DI.JobID = JO.ID
--INNER JOIN
--    dbo.Machines AS MA
--      ON
--      DI.MachNo = MA.MachNo
--INNER JOIN
--    dbo.JobTypes AS JT
--      ON
--      DI.JobTypeID = JT.JobTypeID

一次取消注释一个JOIN,直到计数耗尽。查看该表上发生的情况,并考虑仅在所需列周围使用SUBQUERY连接到SELECT...GROUP BY的情况。实际需要执行的操作取决于所找到的内容,但是您将更清楚地了解要处理的内容。