基于标志创建计算列 - TSQL

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 列吗?

San*_*der 5

CASEsum()函数内使用语句。

样本数据

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)