首页 > 解决方案 > 使用多个联接时如何调整左联接和子查询以修复不正确的 SUMS

问题描述

我无法在查询中获得正确的汇总结果。我试图按人,按日期按工作类型总结所有结果。当我完整地运行我的查询时,我的 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,Extract 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

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

标签: sqlsql-server

解决方案


我不确定您的加入方式是否正确(或者我可能误解了您在此处尝试执行的操作)。我会写这个有点不同:

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 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)

推荐阅读