Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql SQL Server查询,在视图中运行总计,在列A更改时重置_Tsql_Sql Server 2005_Cumulative Sum - Fatal编程技术网

Tsql SQL Server查询,在视图中运行总计,在列A更改时重置

Tsql SQL Server查询,在视图中运行总计,在列A更改时重置,tsql,sql-server-2005,cumulative-sum,Tsql,Sql Server 2005,Cumulative Sum,我的一位同事有一个问题,我正试图帮助他解决 他有一个SQL视图,其中包含以下数据示例数据:- Category Value Cat A 10 Cat A 20 Cat A 30 Cat B 15 Cat B 15 Cat C 10 Cat C 10 他希望向视图中添加一列,该列保持值列的运行总计 当类别更改时,

我的一位同事有一个问题,我正试图帮助他解决

他有一个SQL视图,其中包含以下数据示例数据:-

Category          Value
Cat A             10
Cat A             20
Cat A             30
Cat B             15
Cat B             15
Cat C             10
Cat C             10
他希望向视图中添加一列,该列保持值列的运行总计

当类别更改时,此列必须重置运行总数

因此,输出数据必须如下所示:-

Category          Value       Running
Cat A             10          10
Cat A             20          30
Cat A             30          60
Cat B             15          15
Cat B             15          30
Cat C             10          10
Cat C             10          20
select t1.id, t1.[count], SUM(t2.[count]) as sum
from TableA t1
inner join TableA t2 on t1.id >= t2.id
group by t1.id, t1.[count]
order by t1.id
我们可以通过如下方式将表连接到表本身来获得运行总数:-

Category          Value       Running
Cat A             10          10
Cat A             20          30
Cat A             30          60
Cat B             15          15
Cat B             15          30
Cat C             10          10
Cat C             10          20
select t1.id, t1.[count], SUM(t2.[count]) as sum
from TableA t1
inner join TableA t2 on t1.id >= t2.id
group by t1.id, t1.[count]
order by t1.id

问题是我们没有ID列,当类别更改时,我们如何指示运行总数重置???

这在较大的表上不会表现得特别好,但可以完成这项工作

   select 'Cat A' as class,10 as value into #x
UNION ALL SELECT 'Cat A',20 
UNION ALL SELECT 'Cat A',30 
UNION ALL SELECT 'Cat B',15 
UNION ALL SELECT 'Cat B',15 
UNION ALL SELECT 'Cat C',10 
UNION ALL SELECT 'Cat C',10 

;WITH running_total AS
(
select *
,ROW_number() OVER (PARTITION BY class order by value ASC) as row 
from #x 
)
SELECT 
r1.class
,MAX(r1.value) as value
,SUM(r2.value) as running_total
FROM running_total r1
LEFT OUTER JOIN running_total r2 on r2.class = r1.class
                AND r2.row <= r1.row
GROUP BY 
r1.class
,r1.row
这通过使用通用表表达式CTE和窗口函数来实现。CTE的工作方式与子查询类似,第一部分称为running_total,它根据值向每个类添加一个基于行的ID

Row_number的工作方式与文档中的一样,但它基本上是自动递增的,这取决于您定义分区的方式,基本上与group by相同,但不必在主查询中分组,也不必按类内置顺序分组

在本例中,PartitionSign by class可确保每个新类别名称的最低值都设置为1-如果您想要一个不基于特定类别的总运行总数,则应删除该子句的这一部分

CTE的第二部分从CTE的第一部分选择结果,并在类匹配的地方连接到自身。通过在r2.row上加入,可以将row_NUMBER函数与外部APPLY结合使用


哪个版本的SQL Server?这对于SQL Server 2012来说非常简单,因为if最终完全支持窗口功能。很遗憾,SQL Server 2005。如何计算运行总数的顺序?表格中是否有日期字段?表格将按类别排序,然后按值排序,因此应按照上面显示的数据顺序计算总数。请注意,order by子句必须位于查询中,因为数据是从一个不允许order by子句的视图中提取的。请您向我详细解释这是如何工作的,以及是否有一种方法可以指定如下所示的顺序?请参阅编辑-关于更改顺序,你可以通过……来改变顺序。。。ROW_NUMBER子句的一部分要排序,如您所见Fit我需要底部的order by,以便我可以将其保存在视图中。只需在视图外对结果进行排序。已尝试了两种回答,该回答在6分钟以上运行,其中,下面的回答在3秒钟内运行。但两者都能正常工作。