我有这张桌子:
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]
答案 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())