我无法在查询中获得正确的汇总结果。我试图按人员,按工作类型按日期汇总所有结果。当我全部运行查询时,我的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
关于我在这里缺少什么的任何提示?
答案 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
的情况。实际需要执行的操作取决于所找到的内容,但是您将更清楚地了解要处理的内容。