【问题标题】:How to adapt Left Join and Sub Queries to Fix incorrect SUMS when using Multiple Joins使用多个联接时如何调整左联接和子查询以修复不正确的 SUMS
【发布时间】:2019-01-30 21:01:02
【问题描述】:

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

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

【问题讨论】:

  • 您确实应该将问题简化为两个或三个表,以及示例数据和所需的结果。不过,一般的解决方案是聚合before加入。
  • 在没有样本数据和预期结果的情况下无法为您提供帮助。
  • 您在哪个版本的 SQL Server 上运行?
  • 此服务器正在运行 SQL 2016 SP2 CU4 Enterprise。
  • @GordonLinoff 是的,这就是我的目标,在加入之前进行聚合,它只是适当地应用子查询并知道我需要从内部切换到左的连接。我认为问题在于我引用的 VT 表,因为这是 Extract 列结果的来源。我不确定我是否正确解释了您的简化声明。

标签: sql sql-server


【解决方案1】:

您遇到的问题与您要加入的表格数量无关。问题在于,在这些表中的一个或多个中,根据您指定的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。您实际需要做什么取决于您发现了什么,但您会更具体地了解您正在处理的内容。

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2011-11-15
      相关资源
      最近更新 更多