【发布时间】:2012-08-31 11:49:22
【问题描述】:
有没有一种简单的方法可以将一个值分散到多行?
例如,我的表包含
类型 已开票 已付 电流 收费 100 0 100 收费 100 0 100 收费 100 0 100 付款 0 250 0 付款 0 25 0数据是以这种方式导入的,但我需要根据同时导入的支付交易来填充Current 和Paid 列。
是否有一种简单的方法可以编写查询来确定每条记录的Current 列的余额?
例如,250 将 100 应用于前两条记录,50 应用于接下来的两条记录,而 25 将应用于最后一条,因此在我的表中更新 Current 余额后的最终结果应该是:
理想情况下,我希望使用单个查询来完成此操作,而不是使用游标单独处理每个项目。我一直在尝试通过使用 Row_Number() 函数并加入两个子查询来做到这一点,但我知道我在这里遗漏了一些东西
这是我的第一次尝试,结果得到了当前余额的总和
;with cte(invoiced, paid, current)
as (
select invoiced, paid, current
, row_number() over (order by datecreated)
from mytable
)
select t1.invoiced, t1.paid, sum(t2.invoiced - t2.paid) as [current]
from cte as t1
join cte as t2 on t1.number = t2.number and t2.rownum <= t1.rownum
group by t1.uid, t1.number, t1.rownum
order by t1.rownum
结果:
已开票的当前 100 0 100 100 0 200 100 0 300 0 250 50 0 25 25我确信有办法做到这一点,但现在我的大脑似乎在罢工并且拒绝提出解决方案。
【问题讨论】:
-
我可能是错的,但是 afaik,你在考虑列,SQL 适用于行。也许提供数据集底层的数据结构可能会有所帮助。
-
嗨 - “子选择”和“加入”:很好。你肯定在正确的轨道上。 “Row_number()”:不好。问:有没有定义order的column?例如,“invoice#”或“po_date”?
-
@greg 我的基础数据集几乎是那里的第一个示例数据集,还有一些额外的列,例如
DateCreated、AccountId、TransactionType和一个 Id 字段。我的目标是根据任何Paid交易,用该交易的当前余额填充Current字段。 -
给定的集合是否按 DateCreated DESC 排序?
-
@Rachel - 请同时查看此链接:它可能会有所帮助:geekswithblogs.net/Rhames/archive/2008/10/28/…
标签: sql tsql sql-server-2005