0

我需要从先前值的总和中填充字段。例如:

Id          Price           Total that i need     
----------- ------------  ---------
1           500             500
2           200             500+200 = 700
3           NULL            Because price is null put previous value = 700
4           300             SUM of previous row = 500+200+(calc to 700)+ 300 = 1700 
5           NULL            Because price is null put previous value = 1700  

请注意,我不能使用变量。

我也在使用子查询,但不起作用(只返回不为空的价格总和)。

sql可以实时更新价格(像光标一样逐条记录)?

4

3 回答 3

0

实际上,这是计算运行总计的典型任务。

尝试这个

create table #t(id int, price decimal(10,2), tot_sum decimal(10,2))

insert #t(id, price) values(1, 500)
insert #t(id, price) values(2, 200)
insert #t(id, price) values(3, NULL)
insert #t(id, price) values(4, 300)
insert #t(id, price) values(5, NULL)

update a
set tot_sum=gr.tot_sum
from #t a 
     join(select a.id, max(a.price) as price, sum(isnull(b.price, 0))+max(isnull(a.price,0)) as tot_sum
            from #t a 
                 left join #t b on b.id < a.id
            group by a.id) gr on a.id=gr.id

select * from #t t order by id


drop table #t
于 2013-03-01T05:17:17.590 回答
0

一个有趣的问题,即使有些不寻常。然而它似乎可以解决。如果我没有遗漏任何东西,那么您可以这样做。

  1. 以“正常”方式计算运行总计,即忽略空值(实际上,将它们视为 0)。

  2. 从上一个结果集中,仅选择Price为空的行并计算其运行总计的运行总计。

  3. 将第二个结果集中最接近的前面的“运行运行总计”添加到第一个集中的每个运行总计。

这是我对上述内容的实现:

WITH AllTotals AS (
  SELECT
    Id,
    Price,
    Total = SUM(Price) OVER (ORDER BY Id)
  FROM atable
)
, NullTotals AS (
  SELECT
    Id,
    Total = SUM(Total) OVER (ORDER BY Id)
  FROM AllTotals
  WHERE Price IS NULL
)
SELECT
  Id,
  Price,
  Total = Total + COALESCE((
    SELECT TOP (1) Total
    FROM NullTotals
    WHERE NullTotals.Id < AllTotals.Id
    ORDER BY Id DESC
  ), 0)
FROM AllTotals
;

您可以在 SQL Fiddle尝试此查询。

于 2013-03-01T18:28:16.343 回答
0

你将不得不学习CTE。可以将公用表表达式 (CTE) 视为在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。

CTE 类似于派生表,因为它不存储为对象,并且仅在查询期间持续存在。与派生表不同,CTE 可以是自引用的,并且可以在同一查询中多次引用。CTE 可用于:

  • 创建递归查询。有关详细信息,请参阅使用公用表表达式的递归查询。
  • 在不需要一般使用视图时替换视图;也就是说,您不必将定义存储在元数据中。
  • 启用按从标量子选择派生的列或非确定性或具有外部访问权限的函数进行分组。
  • 在同一语句中多次引用结果表。
于 2013-03-01T05:28:22.477 回答