2016-11-10 80 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

相關問題