【问题标题】:Creating a calculated column based on the flag - TSQL基于标志创建计算列 - TSQL
【发布时间】:2020-12-12 22:39:33
【问题描述】:

我想根据标志计算订单的总和。 示例表:

+--------------+---------------+---------------+
|  Order       |     Flag      |     Amount    |
+--------------+---------------+---------------+
| Order1       |     Yes       |     500       |
| Order1       |     Yes       |     325       |
| Order2       |     Yes       |     799       |
| Order2       |     No        |     550       |
| Order2       |     Yes       |     675       |
| Order3       |     No        |     800       |
+--------------+---------------+---------------+

我想创建 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       |
+--------------+---------------+---------------+---------------+---------------+

我已尝试使用以下代码获取 TotalAmount 列:

SUM(AMOUNT) OVER (PARTITION BY ORDER) AS TOTAL_AMOUNT.

有人可以帮我处理 Yes_amount 列吗?

【问题讨论】:

    标签: sql sql-server tsql sum window-functions


    【解决方案1】:

    sum() 函数中使用CASE 语句。

    样本数据

    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);
    

    解决方案

    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;
    

    结果

    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
    

    【讨论】:

    • 好答案。附带说明:不要使用单引号作为标识符(这里是 select 子句中的别名)。要么不引用它们(首选),要么在 TSQL 中使用方括号 ([])。
    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 2023-03-27
    • 1970-01-01
    • 2022-06-14
    • 2013-05-04
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多