【问题标题】:Creating a new column for -ve values from the existing rows从现有行为 -ve 值创建一个新列
【发布时间】:2019-04-17 14:46:12
【问题描述】:

如何在 SQL Server 中为此编写逻辑:

Voucher #   Name   Amount 
-------------------------
 123        ABC     910
 123        ABC    -910
 224        XYZ     600

预期输出

Voucher #    Name     Amount   - (Amount)
-------------------------------------------
 123         ABC       910       -910
 224         XYZ       600         -

【问题讨论】:

  • 请解释逻辑。您肯定有一些想法,但是数据太简单了。如果多行有“910”怎么办?
  • Helo 先生,我需要一个新列用于 -ve 金额,而不是根据该特定凭证将它们存储在单独的行中
  • 左边都是正值,右边都是负数吗?
  • 如果有多个正面和负面怎么办?您是选择最上面的(基于标准),还是汇总相同的正面和相同的负面?
  • 每个名字只有1个正值和1个负值吗?

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

在这里使用条件聚合非常简单。无需一遍又一遍地查询同一张表。

select Voucher
    , Name
    , Amount = sum(case when Amount > 0 then Amount else 0 end)
    , [-Amount] = sum(case when Amount < 0 then Amount else 0 end)
from YourTable
group by Voucher
    , Name

【讨论】:

    【解决方案2】:

    这是代码,试试看 按负数和正数分组并进行左连接

    DECLARE @tbl TABLE
    (
        Voucher varchar(10),
        Name    varchar(100),
        Amount  int 
    )
    
    INSERT INTO @tbl
    (
        Voucher,
        Name,
        Amount
    )
    VALUES
    (123,'ABC',910),
    (123,'ABC',-910),
    (224,'XYZ',600)
    
    SELECT t1.Voucher, t1.Name, t1.Amount , ISNULL(t2.Amount,0) AS [(-Amount)] FROM (
    SELECT t.Voucher, Name, Sum(t.Amount) Amount 
    FROM @tbl t
    WHERE t.Amount > 0
    GROUP BY t.Voucher, t.Name) t1 Left JOIN 
    (SELECT t.Voucher, Name, Sum(t.Amount) Amount 
    FROM @tbl t
    WHERE t.Amount < 0
    GROUP BY t.Voucher, t.Name) t2 ON t1.Voucher = t2.Voucher
    

    【讨论】:

      【解决方案3】:

      如果对于每个 (Voucher, Name) 仅存在 1 个正数 Amount 和 0 或 1 个负数 Amount,则使用自联接:

      select t.*, tt.amount NegativeAmount
      from tablename t left join tablename tt 
      on tt.voucher = t.voucher and tt.name = t.name and tt.amount < 0
      where t.amount > 0 
      

      请参阅demo
      结果:

      > voucher | name | amount | NegativeAmount
      > ------: | :--- | -----: | -------------:
      >     123 | ABC  |    910 |           -910
      >     224 | XYZ  |    600 |           
      

      【讨论】:

        猜你喜欢
        • 2018-02-11
        • 1970-01-01
        • 2021-01-02
        • 2019-04-17
        • 2021-12-22
        • 2018-10-09
        • 1970-01-01
        • 2023-03-16
        • 2019-12-27
        相关资源
        最近更新 更多