调试 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 字段。这应该可以让您深入了解查询中实际发生的情况。不过,这始终是我进行故障排除的方法...打破聚合,检查数据。如果数据集太大,隔离一个测试组并缩小范围。