调试 SQL 查询
Debugging SQL Query
所以我研究了这个问题,但我找到的解决方案是用于调试语法错误,而我遇到的是逻辑错误。我在 Access 中有一个查询,它正在将 table 连接到一个查询,并且该查询几乎可以完美运行。它运行,它在我想要的地方准确地显示我想要的东西。唯一的问题是它显示的数据是错误的。它有一个按字段分组,然后其他字段是基于查询连接的字段总和。但是,某些 groupbys 的总和是错误的,而对其他人来说是正确的,我不确定为什么。有没有办法进入我的代码并查看其中一些查询在哪里获取数字?
这是我正在处理的查询:
SELECT m.Bldg, Sum([e].[TotCost]*IIf([e].[Utility]="E",1,0)) AS ECost, Sum(g.TotCost*Switch(g.Utility='G',1,True,0)) AS GCost, Sum(h.TotCost*Switch(h.Utility='H',1,True,0)) AS HCost, Sum(c.TotCost*Switch(c.Utility='C',1,True,0)) AS CCost, Sum(w.TotCost*Switch(w.Utility='W',1,True,0)) AS WCost, Sum(s.TotCost*Switch(s.Utility='S',1,True,0)) AS SCost
FROM (((((tblBldgMeters AS m LEFT JOIN qryCurrentMonthMtrHis AS e ON m.EMeters = e.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS g ON m.GMeters = g.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS h ON m.HMeters = h.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS c ON m.CMeters = c.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS w ON m.WMeters = w.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS s ON m.SMeters = s.MeterID
GROUP BY m.Bldg;
问题是成本字段有时对有时错,我不明白为什么。它可以从一百到一百万美元不等。每个建筑物都有几个电表,这些电表的成本必须加在一起,所以我查询每个电表的当前月份成本,然后是 table 列出所有建筑物和相应的电表它。
最好的方法是隔离有效的数据集和无效的数据集。然后打破聚合并验证数据。看看查询实际上在做什么......没有数据样本,甚至没有访问副本,我可以从臀部拍摄像这样的东西:
SELECT m.Bldg,
[e].[TotCost]*IIf([e].[Utility]="E",1,0) AS ECost,
e.Utility as e_Utility
g.TotCost*Switch(g.Utility='G',1,True,0) AS GCost,
g.Utility as g_Utility,
h.TotCost*Switch(h.Utility='H',1,True,0) AS HCost,
h.Utility as h_Utility,
c.TotCost*Switch(c.Utility='C',1,True,0) AS CCost,
c.utility as c_Utility,
w.TotCost*Switch(w.Utility='W',1,True,0) AS WCost,
w.Utility as w_Utility
s.TotCost*Switch(s.Utility='S',1,True,0) AS SCost
s.Utility as s_Utility
FROM
(((((tblBldgMeters AS m
LEFT JOIN qryCurrentMonthMtrHis AS e ON m.EMeters = e.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS g ON m.GMeters = g.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS h ON m.HMeters = h.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS c ON m.CMeters = c.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS w ON m.WMeters = w.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS s ON m.SMeters = s.MeterID
您可能还想分离出 TotCost 字段。这应该可以让您深入了解查询中实际发生的情况。不过,这始终是我进行故障排除的方法...打破聚合,检查数据。如果数据集太大,隔离一个测试组并缩小范围。
所以我研究了这个问题,但我找到的解决方案是用于调试语法错误,而我遇到的是逻辑错误。我在 Access 中有一个查询,它正在将 table 连接到一个查询,并且该查询几乎可以完美运行。它运行,它在我想要的地方准确地显示我想要的东西。唯一的问题是它显示的数据是错误的。它有一个按字段分组,然后其他字段是基于查询连接的字段总和。但是,某些 groupbys 的总和是错误的,而对其他人来说是正确的,我不确定为什么。有没有办法进入我的代码并查看其中一些查询在哪里获取数字?
这是我正在处理的查询:
SELECT m.Bldg, Sum([e].[TotCost]*IIf([e].[Utility]="E",1,0)) AS ECost, Sum(g.TotCost*Switch(g.Utility='G',1,True,0)) AS GCost, Sum(h.TotCost*Switch(h.Utility='H',1,True,0)) AS HCost, Sum(c.TotCost*Switch(c.Utility='C',1,True,0)) AS CCost, Sum(w.TotCost*Switch(w.Utility='W',1,True,0)) AS WCost, Sum(s.TotCost*Switch(s.Utility='S',1,True,0)) AS SCost
FROM (((((tblBldgMeters AS m LEFT JOIN qryCurrentMonthMtrHis AS e ON m.EMeters = e.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS g ON m.GMeters = g.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS h ON m.HMeters = h.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS c ON m.CMeters = c.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS w ON m.WMeters = w.MeterID) LEFT JOIN qryCurrentMonthMtrHis AS s ON m.SMeters = s.MeterID
GROUP BY m.Bldg;
问题是成本字段有时对有时错,我不明白为什么。它可以从一百到一百万美元不等。每个建筑物都有几个电表,这些电表的成本必须加在一起,所以我查询每个电表的当前月份成本,然后是 table 列出所有建筑物和相应的电表它。
最好的方法是隔离有效的数据集和无效的数据集。然后打破聚合并验证数据。看看查询实际上在做什么......没有数据样本,甚至没有访问副本,我可以从臀部拍摄像这样的东西:
SELECT m.Bldg,
[e].[TotCost]*IIf([e].[Utility]="E",1,0) AS ECost,
e.Utility as e_Utility
g.TotCost*Switch(g.Utility='G',1,True,0) AS GCost,
g.Utility as g_Utility,
h.TotCost*Switch(h.Utility='H',1,True,0) AS HCost,
h.Utility as h_Utility,
c.TotCost*Switch(c.Utility='C',1,True,0) AS CCost,
c.utility as c_Utility,
w.TotCost*Switch(w.Utility='W',1,True,0) AS WCost,
w.Utility as w_Utility
s.TotCost*Switch(s.Utility='S',1,True,0) AS SCost
s.Utility as s_Utility
FROM
(((((tblBldgMeters AS m
LEFT JOIN qryCurrentMonthMtrHis AS e ON m.EMeters = e.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS g ON m.GMeters = g.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS h ON m.HMeters = h.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS c ON m.CMeters = c.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS w ON m.WMeters = w.MeterID)
LEFT JOIN qryCurrentMonthMtrHis AS s ON m.SMeters = s.MeterID
您可能还想分离出 TotCost 字段。这应该可以让您深入了解查询中实际发生的情况。不过,这始终是我进行故障排除的方法...打破聚合,检查数据。如果数据集太大,隔离一个测试组并缩小范围。