如何适应左联接和子查询时使用多加入修正不正确的SUMS

问题描述 投票:0回答:2

我无法让我的查询正确总结的结果。我试图通过人来总结所有的结果,按照日期类型的工作。当我的全部运行我的查询,我和结果是天文数字。

我使用的表和字段:运营商(OprExtID)和vwProductionDataForTouchReporting(OPR,提取物)。请注意,我删除了表/字段并加入了允许分组“按工种”暂时为这些连接都引起我的高数总和。

我加入之前我想我需要使用子查询来总结我的结果,但我遇到了一个错误,当我尝试它的加入回来。

我发现了一个“近‘’有语法错误。”错误。在我做错了任何想法。

这里是我当前的查询:

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

在什么我失踪这里有什么建议?

sql sql-server
2个回答
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。你真正需要做的,将取决于你发现了什么,但你知道更具体的你处理什么用。


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 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)
© www.soinside.com 2019 - 2024. All rights reserved.