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 字段。因此,如果您想要一整天,您首先需要将该字段转换为日期。

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

Similar to @FergusBown you could use:

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