2016-11-10 75 views
2

我正在使用包含日期,单位ID,仪表读数和更正的Access 2010表格。我想通过取当前日期并与前一次相减来读取仪表的日常读数。这里是我有的表格的一个例子:如何区分当前数据和以前的数据?

InputDate | UnitID | MeterReading | Correction 
--------- | ------ | ------------ | ---------- 
11/1/2016 | U1  | 41476  | 10000 
11/1/2016 | U2  | 5991   | 10000 
11/1/2016 | U3  | 164205  | 1000000 
11/1/2016 | U4  | 11160  | 100000 
11/2/2016 | U1  | 41490  | 10000 
11/2/2016 | U2  | 5991   | 10000 
11/2/2016 | U3  | 164205  | 1000000 
11/2/2016 | U4  | 11169.3  | 100000 

我试过这样做了许多不同的方法。我得到它的唯一方法是做一个查询来为每个单元拆分表(例如U1,U2等)。从那我会查询该结果,并做这个计算:

(
([MeterReading]+[Correction]) - 
(DLookUp("MeterReading", "tblA", "[tblA].[InputDate] = #" & 
DateAdd("d",-1,[tblA].[InputDate]) & "#")+[Correction]) 
) 

然后,我会做另一个查询按日期分组的所有数据。

我的问题是如果有一个更直观的方式来做到这一点?我已经研究过如何尝试执行SQL查询,嵌套查询以及按Unit_ID进行分组,但是我的计算已关闭。我认为DLookUp在计算时没有考虑正确的单位,因为同一天有多个单位。另外,当我尝试按InputDate和UnitID进行分组时,我会得到“您的查询不包含指定的表达式”。我是SQL语言的新手,所以任何帮助将不胜感激。

样本输出是:

InputDate | UnitID | MeterRunTime 
--------- | ------ | ------------ 
11/2/2016 | U1  | 14 
11/2/2016 | U2  | 0 
11/2/2016 | U3  | 0 
11/2/2016 | U4  | 9.3 
+0

你能给出你期望的样本输出吗? –

+0

SQL沙箱http://rextester.com/GYVR98570 - 但我不确定你的意思是“我想通过取当前日期并与前一次相减来读取仪表的日常读数”;你是否在寻找每日平均读数(如每日平均使用量)? – Aron

+0

新增样本输出@JyotiVinayPandey – BESGOTCIY

回答

0

如果我正确理解你下面的应该给你你需要什么。

SELECT tblA.InputDate, tblA.UnitID, 
([tblA].[MeterReading]+[tblA].[Correction])- 
([tblA_1].[MeterReading]+[tblA_1].[Correction]) AS MeterRunTime 
FROM tblA INNER JOIN tblA AS tblA_1 
ON (tblA.InputDate-1 = tblA_1.InputDate) AND (tblA.UnitID = tblA_1.UnitID); 
+0

对于未来的读者和OP,请解释您的解决方案如何解决OP的问题。代码本身并没有帮助。 – Parfait

+0

乍一看,这将工作提供一个阅读是每天采取 - 周末,银行假期等读取?也许寻找比当前日期更少的最大日期 - 这将从上次读数开始读取,而不是每日读数。 –

+0

谢谢,这个解决方案适合我!阅读应每天进行,但有时候会有差距。代码将采取下一个可用的最大日期@Darren Bartrup-Cook? – BESGOTCIY

0

注意:我在SQL有点生疏所以毫无疑问,有人能在这个提高。

要返回下一个可用日期,您需要为每个UnitID找到小于当前日期的最大日期,以及相同的当前日期。

这两个SQL语句会做到这一点:

SELECT  MAX(tblA_1.InputDate) AS MaxDate 
      ,tblA_1.UnitID 
FROM  tblA tblA_1 INNER JOIN tblA tblA_2 ON tblA_1.UnitID = tblA_2.UnitID AND 
                tblA_1.InputDate < tblA_2.InputDate 
GROUP BY tblA_1.UnitID 

SELECT  MAX(InputDate) AS CurrentDate 
      ,UnitID 
FROM  tblA 
GROUP BY UnitID 

接下来,您将需要包括抄表+更正以前的结果:

SELECT  MaxDate 
      ,T1.UnitID 
      ,MeterReading+Correction AS LastReading 
FROM  tblA T1 INNER JOIN 
      (
      SELECT  MAX(tblA_1.InputDate) AS MaxDate 
         ,tblA_1.UnitID 
      FROM  tblA tblA_1 INNER JOIN tblA tblA_2 ON tblA_1.UnitID = tblA_2.UnitID AND 
                   tblA_1.InputDate < tblA_2.InputDate 
      GROUP BY tblA_1.UnitID 
      ) T2 ON T1.InputDate = T2.MaxDate 
GROUP BY MaxDate 
      ,T1.UnitID 
      ,MeterReading+Correction 

SELECT  CurrentDate 
      ,T4.UnitID 
      ,MeterReading+Correction AS CurrentReading 
FROM  tblA T3 INNER JOIN 
      (
      SELECT  MAX(InputDate) AS CurrentDate 
         ,UnitID 
      FROM  tblA 
      GROUP BY UnitID 
      ) T4 ON T3.InputDate = T4.CurrentDate AND T3.UnitID = T4.UnitID 
GROUP BY CurrentDate 
      ,T4.UnitID 
      ,MeterReading+Correction 

最后你能坚持一大堆一起给你的最终结果:

SELECT CurrentDate 
     ,MaxDate 
     ,T1.UnitID 
     ,LastReading 
     ,CurrentReading 
     ,CurrentReading - LastReading AS FinalReading 
FROM 
     (
     SELECT  MaxDate 
        ,T1.UnitID 
        ,MeterReading+Correction AS LastReading 
     FROM  tblA T1 INNER JOIN 
         (
          SELECT  MAX(tblA_1.InputDate) AS MaxDate 
             ,tblA_1.UnitID 
          FROM  tblA tblA_1 INNER JOIN tblA tblA_2 ON tblA_1.UnitID = tblA_2.UnitID AND 
                   tblA_1.InputDate < tblA_2.InputDate 
          GROUP BY tblA_1.UnitID 
         ) T2 ON T1.InputDate = T2.MaxDate 
     GROUP BY MaxDate 
        ,T1.UnitID 
        ,MeterReading+Correction 
     ) T5 
     INNER JOIN 
     (
     SELECT  CurrentDate 
        ,T4.UnitID 
        ,MeterReading+Correction AS CurrentReading 
     FROM  tblA T3 INNER JOIN 
         (
          SELECT  MAX(InputDate) AS CurrentDate 
             ,UnitID 
          FROM  tblA 
          GROUP BY UnitID 
         ) T4 ON T3.InputDate = T4.CurrentDate AND T3.UnitID = T4.UnitID 
     GROUP BY CurrentDate 
        ,T4.UnitID 
        ,MeterReading+Correction 
     ) T6 ON T5.UnitID = T6.UnitID 

enter image description here

正如你所看到的,改变日期使最终查询输出没有什么区别: enter image description here

相关问题