字段显示前30天总计

时间:2012-12-03 14:11:09

标签: sql sql-server sql-server-2008-r2

我有这张桌子:

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]

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

请注意您使用的是DATETIME字段。因此,如果您想要整天,首先需要将字段转换为DATE。

CONVERT(DATE, a.[Date]) >= CONVERT(DATEADD(d, -30, DATE), b.[Date]) AND
CONVERT(DATE, a.[Date]) <= CONVERT(DATE, b.[Date])

答案 2 :(得分:-1)

与@FergusBown类似,您可以使用:

DATEADD(mm,-1,GETDATE())