2017-03-19 23 views
0


今月と前月の最後の記録値を取得する必要があります。月に約4,600件のレコードがあります。
現在の月と前月の最後のレコードを取得する

次の値が、それは返す「0」2ヶ月間、私が試してみましたコードではなく:

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()には時間と日付の両方が含まれているため、一致するものが見つかりません。

1つのオプションは、両方の値を日付にキャストしてから比較することです。私が開始する前に

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

こんにちはゴードン。私はあなたの例を実行しようとしましたが、メッセージ4104、レベル16、状態1、行3を取得しています マルチパート識別子 "ltv.DateTimeStamp"をバインドできませんでした。 2つのDateTimeStampの場合、最初のselect句のltv.FloatVALUE。 – RussH

関連する問題