0

私はこのテーブルを持っています:

CREATE TABLE #Data1 
    (
    [Market] VARCHAR(100) NOT NULL, 
    [Operator] VARCHAR(100) NOT NULL,                                                                   
    [Date] DATETIME NOT NULL,   
    [Measure] VARCHAR(100) NOT NULL, 
    [Amount] NUMERIC(36,10)  NOT NULL, 
                --new calculated fields 
    [DailyAvg_30days] NUMERIC(38,6) NULL    DEFAULT 0                                   
    )

を除くすべてのフィールドにデータを入力しましたDailyAvg_30days
このフィールドには、過去30日間の合計を表示する必要があります(例:
1 )。Date特定のレコードが12月2日である場合、11月3日から12月2日までの期間の合計になります。
2.Date特定のレコードが12月1日の場合、11月2日から12月1日までの期間の合計になります。

テーブルを更新する前にこれらの合計を見つけようとする私の試みは次のとおりです。

SELECT 
    a.[Market],
    a.[Operator],
    a.[Date],
    a.[Measure],
    a.[Amount],
    [DailyAvg_30days] = SUM(b.[Amount])
FROM 
    #Data1 a
    INNER JOIN #Data1 b
        ON 
        a.[Market] = b.[Market] AND
        a.[Operator] = b.[Operator] AND
        a.[Measure] = b.[Measure]   AND
        a.[Date] > b.[Date]-30 AND
        a.[Date] <= b.[Date]
GROUP BY
    a.[Market],
    a.[Operator],
    a.[Date],
    a.[Measure],
    a.[Amount]
ORDER BY 1,2,4,3

これは有効なアプローチですか、それとも別の角度からアプローチする必要がありますか?


編集

ロジックに欠陥がありました。私の同僚のJagodaが最初に答えを得て、次にGordon Linoffが、私が読みやすい構文を提案しました。

FROM 
    #DataCas a
    INNER JOIN #DataCas b
        ON 
        a.[Market] = b.[Market] AND
        a.[Operator] = b.[Operator] AND
        a.[Measure] = b.[Measure]   AND
        b.[Date]  BETWEEN a.[Date]-29 AND a.[Date]
4

3 に答える 3

1

後ではなく、a.dateのの日付を探す必要があります。それで:

    a.[Date] >= b.[Date]-30 AND
    a.[Date] <= b.[Date]

する必要があります:

b.[date] >= a.[date] - 30 and
b.[date] <= a.[date]

または、より明確に:

b.[date] between a.[date] - 30 and a.[date]
于 2012-12-03T15:18:45.893 に答える
0

DATETIMEフィールドを使用していることに注意してください。したがって、1日中必要な場合は、最初にフィールドをDATEに変換する必要があります。

CONVERT(DATE, a.[Date]) >= CONVERT(DATEADD(d, -30, DATE), b.[Date]) AND
CONVERT(DATE, a.[Date]) <= CONVERT(DATE, b.[Date])
于 2012-12-03T17:02:33.453 に答える
-1

@FergusBownと同様に、次のものを使用できます。

DATEADD(mm,-1,GETDATE())
于 2012-12-03T15:25:54.763 に答える