Sql 我们如何在每日报告的同一行中获得今天的值和过去7天的值?

Sql 我们如何在每日报告的同一行中获得今天的值和过去7天的值?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我在SQLServer2008R2中有一个表,有3列:名称、日期和今天的值。我可以很容易地在报告中显示,但我们也需要在同一报告中查看过去7天的总值。我的意思是,每一行都应该表示为名称、日期、今天的值和最后7天的总数 您可以帮助查询吗?由于您不能使用排序的窗口聚合来生成总计,因此您可以通过自联接和交叉应用在无子选择或非等联接逻辑的情况下执行此操作: SELECT t.Name, t.Date, t.Value, (SELECT SUM(s.Value) FROM y

我在SQLServer2008R2中有一个表,有3列:名称、日期和今天的值。我可以很容易地在报告中显示,但我们也需要在同一报告中查看过去7天的总值。我的意思是,每一行都应该表示为名称、日期、今天的值和最后7天的总数


您可以帮助查询吗?

由于您不能使用排序的窗口聚合来生成总计,因此您可以通过自联接和交叉应用在无子选择或非等联接逻辑的情况下执行此操作:

SELECT 
    t.Name, t.Date, t.Value, 
    (SELECT SUM(s.Value) 
     FROM your_table s 
     WHERE s.date <= t.date 
       AND s.date > DATEADD(DAY, -7, t.date
    ) AS last_7day_value
FROM 
    your_table t
WHERE 
    t.date BETWEEN @start_date AND @end_date;
输出
欢迎来到堆栈溢出!首先,我建议大家带上相机,特别是环顾四周。复习你的材料,自己试一试,如果你还被卡住了。人们会很乐意帮忙的。嗨,谢谢你的详细解释。它起作用了。但是,如果我在一天中有超过1个不同小时的数据,它会在输出中为每天创建超过1条记录。它不好用。你们能在一天内用一个以上的数据来测试它吗。你能自己解决吗?您需要按照日期时间的日期进行分组,所以请在我给您的代码示例中这样做。您好,非常感谢您的快速回答。我们需要在where之后添加s.Name=t.Name,然后它就可以工作了。当做
declare @t table(ValueName varchar(10),ValueDate date, ValueAmount int);
insert into @t values
 ('Name 1','20190101',4)
,('Name 1','20190102',3)
,('Name 1','20190103',8)
,('Name 1','20190104',6)
,('Name 1','20190105',9)
,('Name 1','20190106',6)
,('Name 1','20190107',3)
,('Name 1','20190108',2)
,('Name 1','20190109',1)
,('Name 2','20190101',3)
,('Name 2','20190102',7)
,('Name 2','20190103',6)
,('Name 2','20190104',8)
,('Name 2','20190105',8)
,('Name 2','20190106',7)
,('Name 2','20190107',6)
,('Name 2','20190108',9)
,('Name 2','20190109',3);

select t.ValueName
      ,t.ValueDate
      ,t.ValueAmount
      ,t.ValueAmount + isnull(sum(p.ValueAmount),0) as SevenDayTotal
from @t as t
    cross apply(values(dateadd(day,-1,t.ValueDate))
                     ,(dateadd(day,-2,t.ValueDate))
                     ,(dateadd(day,-3,t.ValueDate))
                     ,(dateadd(day,-4,t.ValueDate))
                     ,(dateadd(day,-5,t.ValueDate))
                     ,(dateadd(day,-6,t.ValueDate))
                     ) as d(d)
    left join @t as p
        on t.ValueName = p.ValueName
            and p.ValueDate = d.d
group by t.ValueName
      ,t.ValueDate
      ,t.ValueAmount
order by t.ValueName
      ,t.ValueDate;
+-----------+------------+-------------+---------------+
| ValueName | ValueDate  | ValueAmount | SevenDayTotal |
+-----------+------------+-------------+---------------+
| Name 1    | 2019-01-01 |           4 |             4 |
| Name 1    | 2019-01-02 |           3 |             7 |
| Name 1    | 2019-01-03 |           8 |            15 |
| Name 1    | 2019-01-04 |           6 |            21 |
| Name 1    | 2019-01-05 |           9 |            30 |
| Name 1    | 2019-01-06 |           6 |            36 |
| Name 1    | 2019-01-07 |           3 |            39 |
| Name 1    | 2019-01-08 |           2 |            37 |
| Name 1    | 2019-01-09 |           1 |            35 |
| Name 2    | 2019-01-01 |           3 |             3 |
| Name 2    | 2019-01-02 |           7 |            10 |
| Name 2    | 2019-01-03 |           6 |            16 |
| Name 2    | 2019-01-04 |           8 |            24 |
| Name 2    | 2019-01-05 |           8 |            32 |
| Name 2    | 2019-01-06 |           7 |            39 |
| Name 2    | 2019-01-07 |           6 |            45 |
| Name 2    | 2019-01-08 |           9 |            51 |
| Name 2    | 2019-01-09 |           3 |            47 |
+-----------+------------+-------------+---------------+