Sql 超过一组的运行总数(2012年前)
很抱歉再次提起这个话题,我遇到了几个非常相似的有用的现有帖子,但是stackoverflow不允许我在现有帖子上发表评论/问题,因为我是一个新的帖子,分数不到50分 不管怎么说,很多运行总员额是伟大的1组/运行总只。当我引入第二组时,我希望运行总数再次从0开始,它会不断地将它们相加 我已经成功地使用了古怪的更新、带递归的CTE等等。。。但不适用于多个群体 我要寻找的基本输出如下所示:Sql 超过一组的运行总数(2012年前),sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,很抱歉再次提起这个话题,我遇到了几个非常相似的有用的现有帖子,但是stackoverflow不允许我在现有帖子上发表评论/问题,因为我是一个新的帖子,分数不到50分 不管怎么说,很多运行总员额是伟大的1组/运行总只。当我引入第二组时,我希望运行总数再次从0开始,它会不断地将它们相加 我已经成功地使用了古怪的更新、带递归的CTE等等。。。但不适用于多个群体 我要寻找的基本输出如下所示: NAME DATE DOLLARS RUNNING John 1/1/2014
NAME DATE DOLLARS RUNNING
John 1/1/2014 5 5
John 1/2/2014 3 8
John 1/2/2014 4 12
John 1/2/2014 8 20
John 1/3/2014 12 32
Matt 1/1/2014 2 2
Matt 1/2/2014 7 9
Matt 1/3/2014 10 19
select name, date, dollars, sum(dollars) running
from table t
group by name, date, dollars with rollup
我怎样才能做到这一点?先谢谢你
以下是我遇到的一些有用的文章:
可以使用相关子查询执行此操作:
select name, date, dollars,
(select sum(dollars)
from table t2
where t2.name = t.name and
t2.date <= t.date
) as running
from table t;
编辑:
如果在同一日期有多行,则需要引入另一个排序标准。问题中的数据没有其他顺序列,例如id。因此,我们可以创建一个:
with t as (
select t.*, row_number() over (partition by name order by date) as seqnum
from table t
)
select name, date, dollars,
(select sum(dollars)
from t t2
where t2.name = t.name and
t2.seqnum <= t.seqnum
) as running
from t t;
唯一的问题是,日期内的行将是任意顺序的,甚至可能在执行查询之间发生变化。SQL表本质上是无序的,因此您需要一列来指定顺序。您可以使用相关子查询执行此操作:
select name, date, dollars,
(select sum(dollars)
from table t2
where t2.name = t.name and
t2.date <= t.date
) as running
from table t;
编辑:
如果在同一日期有多行,则需要引入另一个排序标准。问题中的数据没有其他顺序列,例如id。因此,我们可以创建一个:
with t as (
select t.*, row_number() over (partition by name order by date) as seqnum
from table t
)
select name, date, dollars,
(select sum(dollars)
from t t2
where t2.name = t.name and
t2.seqnum <= t.seqnum
) as running
from t t;
唯一的问题是,日期内的行将是任意顺序的,甚至可能在执行查询之间发生变化。SQL表本质上是无序的,因此您需要一列来指定顺序。您可以使用外部应用:
您可以使用外部应用程序:
您可以像这样使用汇总或多维数据集:
NAME DATE DOLLARS RUNNING
John 1/1/2014 5 5
John 1/2/2014 3 8
John 1/2/2014 4 12
John 1/2/2014 8 20
John 1/3/2014 12 32
Matt 1/1/2014 2 2
Matt 1/2/2014 7 9
Matt 1/3/2014 10 19
select name, date, dollars, sum(dollars) running
from table t
group by name, date, dollars with rollup
您可以像这样使用汇总或多维数据集:
NAME DATE DOLLARS RUNNING
John 1/1/2014 5 5
John 1/2/2014 3 8
John 1/2/2014 4 12
John 1/2/2014 8 20
John 1/3/2014 12 32
Matt 1/1/2014 2 2
Matt 1/2/2014 7 9
Matt 1/3/2014 10 19
select name, date, dollars, sum(dollars) running
from table t
group by name, date, dollars with rollup
我已经编辑了你的标题。请看,如果一致意见是否定的,他们不应该。在你的新问题中,你如何知道同一日期的所有行中哪一行先到?这实际上是一个日期时间,所以我已经按日期时间排序了-谢谢我已经编辑了你的标题。请看,如果共识是否定的,他们不应该。在你的新问题中,你如何知道同一日期的所有行中哪一行先到?这实际上是一个日期时间,所以我已经按日期时间排序了-谢谢,这很有效,但是如果同一日期有多行,它返回该日期组中每行的运行总数。对不起,我已经在上面编辑了我的帖子。对您的查询稍加修改就能得到这些结果吗?另外,如果我要为分组引入另一个专栏,比如公司,我能通过这个来处理吗?非常感谢!!再次感谢您的回复!出于某种原因,这仍然给了我每个日期每行的总天数,例如,2014年1月2日,JOHN在3行的运行列中得到了“20”。这是非常奇怪的行为。t子查询应该有一个在每行上都不同的序列号。如果您有一个id列,则将其添加到order by以使排序按日期、id稳定。多亏了这一点,但是如果同一日期有多行,它会返回该日期组中每行的运行总数。对不起,我已经在上面编辑了我的帖子。对您的查询稍加修改就能得到这些结果吗?另外,如果我要为分组引入另一个专栏,比如公司,我能通过这个来处理吗?非常感谢!!再次感谢您的回复!出于某种原因,这仍然给了我每个日期每行的总天数,例如,2014年1月2日,JOHN在3行的运行列中得到了“20”。这是非常奇怪的行为。t子查询应该有一个在每行上都不同的序列号。如果您有一个id列,那么将其添加到order by,以使排序按日期、id稳定。非常感谢-这给了我我要求的结果,但是上面的查询产生的结果快了一点!再次感谢Hanks-这给了我我想要的结果,但是上面的查询产生的结果快了一点!再次感谢