Ane*_*a A 0 sql t-sql sql-server sum window-functions
我想根据标志计算订单的总和。示例表:
+--------------+---------------+---------------+
| Order | Flag | Amount |
+--------------+---------------+---------------+
| Order1 | Yes | 500 |
| Order1 | Yes | 325 |
| Order2 | Yes | 799 |
| Order2 | No | 550 |
| Order2 | Yes | 675 |
| Order3 | No | 800 |
+--------------+---------------+---------------+
Run Code Online (Sandbox Code Playgroud)
我想创建 2 个新列。
一列是订单总量,另一列是订单总量,其中标志为“是”。
上例表中想要的结果:
+--------------+---------------+---------------+---------------+---------------+
| Order | Flag | Amount | TotalAmount | Yes_amount |
+--------------+---------------+---------------+---------------+---------------+
| Order1 | Yes | 500 | 825 | 825 |
| Order1 | Yes | 325 | 825 | 825 |
| Order2 | Yes | 799 | 2024 | 1474 |
| Order2 | No | 550 | 2024 | 1474 |
| Order2 | Yes | 675 | 2024 | 1474 |
| Order3 | No | 800 | 800 | 0 |
+--------------+---------------+---------------+---------------+---------------+
Run Code Online (Sandbox Code Playgroud)
我已尝试使用以下代码来获取 TotalAmount 列:
SUM(AMOUNT) OVER (PARTITION BY ORDER) AS TOTAL_AMOUNT.
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我使用 Yes_amount 列吗?
CASE
在sum()
函数内使用语句。
样本数据
declare @MyTable table
(
[Order] nvarchar(10),
[Flag] nvarchar(3),
[Amount] int
);
insert into @MyTable ([Order], [Flag], [Amount]) values
('Order1', 'Yes', 500),
('Order1', 'Yes', 325),
('Order2', 'Yes', 799),
('Order2', 'No', 550),
('Order2', 'Yes', 675),
('Order3', 'No', 800);
Run Code Online (Sandbox Code Playgroud)
解决方案
select mt.[Order], mt.[Flag], mt.[Amount],
SUM(AMOUNT) OVER (PARTITION BY [ORDER]) AS 'TOTAL_AMOUNT',
SUM(case when [Flag]='Yes' then AMOUNT else 0 end) OVER (PARTITION BY [ORDER]) AS 'Yes_AMOUNT'
from @MyTable mt;
Run Code Online (Sandbox Code Playgroud)
结果
Order Flag Amount TOTAL_AMOUNT Yes_AMOUNT
---------- ---- ----------- ------------ -----------
Order1 Yes 500 825 825
Order1 Yes 325 825 825
Order2 Yes 799 2024 1474
Order2 No 550 2024 1474
Order2 Yes 675 2024 1474
Order3 No 800 800 0
Run Code Online (Sandbox Code Playgroud)