2017-03-19 41 views
0


我需要獲取當前月份和上個月的最後記錄值。每月大約有4,600條記錄。
檢索當前月份和上個月的最後一條記錄

以下是我已經嘗試了代碼,但它返回「0」爲兩個月,而不是價值:

SELECT a.LogPoint as [Meter] 
,max(CASE WHEN c.DateTimeStamp = dateadd(MM,-1,getdate()) THEN c.FloatVALUE ELSE 0 END) as [Total LAST Month] 
,max(CASE WHEN c.DateTimeStamp = getdate() THEN c.FloatVALUE ELSE 0 END) as [Total This Month] 
FROM 
    SWR.dbo.LoggedEntities a 
    ,SWR.dbo.TrendLogRelation b 
    ,SWR.dbo.LogTimeValues c 
WHERE 
     a.GUID = b .GUID 
    AND a.Type LIKE 'trend.ETLog' 
    AND a.LogPoint = 'WsumOut_Trnd' 
    AND b.EntityID = c.ParentID 
GROUP BY a.LogPoint 

任何幫助將不勝感激。
乾杯。

+0

看看EOMONTH()命令:https://msdn.microsoft.com/en-us/library/hh213020.aspx。這可能會節省一些頭痛 – LordBaconPants

回答

1

我假設LogPoint是主鍵。正確?在這種情況下,檢查以下內容:

SELECT mainA.LogPoint AS [Meter], 
     lastMonth.FloatValue AS [Total LAST Month], 
     thisMonth.FloatValue AS [Total This Month] 
FROM SWR.dbo.LoggedEntities mainA 
    CROSS APPLY 
    (
     SELECT TOP 1 c.FloatVALUE 
     FROM SWR.dbo.LoggedEntities a 
      JOIN SWR.dbo.TrendLogRelation b ON a.GUID = b.GUID 
      JOIN SWR.dbo.LogTimeValues c ON b.EntityID = c.ParentID 
     WHERE a.LogPoint = mainA.LogPoint 
     ORDER BY c.DateTimeStamp DESC 
    ) thisMonth 
    CROSS APPLY 
    (
     SELECT TOP 1 c.FloatVALUE 
     FROM SWR.dbo.LoggedEntities a 
      JOIN SWR.dbo.TrendLogRelation b ON a.GUID = b.GUID 
      JOIN SWR.dbo.LogTimeValues c ON b.EntityID = c.ParentID 
     WHERE a.LogPoint = mainA.LogPoint AND c.DateTimeStamp <= DATEADD(MM,-1,GETDATE()) 
     ORDER BY c.DateTimeStamp DESC 
    ) lastMonth 
WHERE a.Type LIKE 'trend.ETLog' 
     AND a.LogPoint = 'WsumOut_Trnd'; 

就意識到,我錯過了上個月日期檢查。現在添加。試試:)

0

getdate()包括時間和日期,這就是爲什麼你沒有得到任何匹配。

一種選擇是將兩個值都轉換爲日期,然後進行比較。我開始前

0

兩個重要點:FROM子句中

  1. 決不使用逗號。 總是使用明確的JOIN語法。
  2. 表別名應該是表的縮寫。

然後,你要使用row_number()

SELECT LogPoint as [Meter], 
     max(CASE WHEN seqnum = 1 AND 
        DATEDIFF(month, DateTimeStamp, getdate()) = 1 
       THEN cltv.FloatVALUE 
      END) as [Total LAST Month], 
     max(CASE WHEN seqnum = 1 AND 
        DATEDIFF(month, DateTimeStamp, getdate()) = 0 
       THEN ltv.FloatVALUE 
      END) as [Total This Month] 
FROM (SELECT le.LogPoint, ltv.DateTimeStamp, 
      ROW_NUMBER() OVER (PARTITION BY YEAR(DateTimeStamp), MONTH(DateTimeStamp) 
           ORDER BY DateTimeStamp DESC 
           ) as seqnum 
     FROM SWR.dbo.LoggedEntities le JOIN 
      SWR.dbo.TrendLogRelation tlr 
      ON le.GUID = tlr.GUID JOIN 
      SWR.dbo.LogTimeValues ltv 
      ON ltr.EntityID = ltv.ParentID 
     WHERE le.Type LIKE 'trend.ETLog' AND 
      le.LogPoint = 'WsumOut_Trnd' AND 
      DATEDIFF(month, ltv.DateTimeStamp, getdate()) IN (0, 1) 
    ) x 
WHERE seqnum = 1; 
+0

嗨戈登。我嘗試過運行你的例子,但是得到「Msg 4104,Level 16,State 1,Line 3 無法綁定多部分標識符」ltv.DateTimeStamp「。」對於兩個DateTimeStamp和第一個select子句中的ltv.FloatVALUE。 – RussH

相關問題