gpt4 book ai didi

tsql - SQL Server 查询,在 View 中运行总计,在 A 列更改时重置

转载 作者:行者123 更新时间:2023-12-05 00:00:19 24 4
gpt4 key购买 nike

我的一位同事有一个问题,我正在努力帮助他。

他有一个 SQL View ,其中包含以下数据(示例数据):-

Category          Value
Cat A 10
Cat A 20
Cat A 30
Cat B 15
Cat B 15
Cat C 10
Cat C 10

他想向 View 中添加一列,该列保留“值”列的运行总计。

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

所以输出数据必须是这样的:-
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() 按照文档工作 here但基本上它会根据您定义分区的方式(本质上与 group by 相同,但不必在主查询中分组)和按类的内置顺序自动递增。

在这个示例中,按类划分确保每个新类别名称的最低值都设置为 1 - 如果您想要不基于特定类别的总运行总数,您将删除子句的这一部分。

CTE 的第二部分从 CTE 的第一部分中选择结果,并在类匹配时连接到自身。通过加入 r2.row <= r1.row 这确保第二个连接包括所有值 <= 当前行 - 即 R1 中的第 3 行将包括 R2 连接中的第 1、2、3 行。

关于tsql - SQL Server 查询,在 View 中运行总计,在 A 列更改时重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10380741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com