【问题标题】:How to add positive and negative totals from the same column如何从同一列添加正数和负数
【发布时间】:2019-02-01 12:45:46
【问题描述】:

我正在使用带有一个名为dbo.over_short 的表的sql server,并且我正在尝试找出如何从同一列中添加总计。

我有一个名为FINAL_OVER_SHORT_AMOUNT 的列,它的设计是小数(10,2)。

在此字段中,有正数(例如 608.90)中性数(​​例如 0.00)和负数(例如 -608.90)。

是否可以将所有正数加在一起,将所有负数加在一起(以减号开头的数字)。

基本上要报告多少已经结束,多少是负面的? (没有从正数中减去负数。两个单独的总数)

select 
  ID,
  TRANSACTION_DATE,
  ASSOCIATE_ID,
  AGENCY_CODE,     
  FINAL_OVER_SHORT_AMOUNT
from
  dbo.over_short

对此的任何帮助将不胜感激!

【问题讨论】:

  • sum(case when FINAL_OVER_SHORT_AMOUNT >= 0 then FINAL_OVER_SHORT_AMOUNT else 0 end)sum(case when FINAL_OVER_SHORT_AMOUNT < 0 then FINAL_OVER_SHORT_AMOUNT else 0 end) 但您需要对数据进行分组以供 sum 工作。
  • @DaleBurrell 实际上,应该可以对整个表格进行求和。
  • @TimBiegeleisen 如果他们拉动id 字段,如图所示:) 我猜这是日期范围所必需的。但发帖人可以确认。

标签: sql-server tsql


【解决方案1】:

您可以在这里使用条件聚合:

SELECT
    SUM(CASE WHEN FINAL_OVER_SHORT_AMOUNT >= 0
             THEN FINAL_OVER_SHORT_AMOUNT ELSE 0 END) AS pos_amount,
    SUM(CASE WHEN FINAL_OVER_SHORT_AMOUNT < 0
             THEN FINAL_OVER_SHORT_AMOUNT ELSE 0 END) AS neg_amount
FROM dbo.over_short;

您还可以使用类似的查询以及 GROUP BY,假设您想要给定组/列的正/负总和,例如ID 列。

【讨论】:

  • 是的,你可以这样做,但你原来的问题没有提到这一点,因此我没有在我的回答中包含它。
【解决方案2】:

Sign 是一个方便的小功能:

-- Sample data.
declare @Samples as Table ( Sample Decimal(10,2) );
insert into @Samples ( Sample ) values
  ( -10.00 ), ( -5.00 ), ( 0.00 ), ( 42.00 ), ( 8.00 );

-- Demonstrate separating values by sign.
select Sample,
  Sample * -Sign( Sign( Sample ) - 1 ) as Negative,
  Sample * Sign( Sign( Sample ) + 1 ) as Positive
  from @Samples;

-- Calculate the sums.
select Sum( Sample ) as Total,
  Sum( Sample * -Sign( Sign( Sample ) - 1 ) ) as NegativeTotal,
  Sum( Sample * Sign( Sign( Sample ) + 1 ) ) as PositiveTotal
  from @Samples;

【讨论】:

    【解决方案3】:

    你可以用这个
    select sum(case when FINAL_OVER_SHORT_AMOUNT>0 then FINAL_OVER_SHORT_AMOUNT else 0 end)as Positive, sum(case when FINAL_OVER_SHORT_AMOUNT<0 then FINAL_OVER_SHORT_AMOUNT else 0 end) as Negative from over_short
    或者 您可以在 Temp 表中单独存储结果并使用它
    select sum(case when FINAL_OVER_SHORT_AMOUNT>0 then FINAL_OVER_SHORT_AMOUNT else 0 end)as Positive, sum(case when FINAL_OVER_SHORT_AMOUNT<0 then FINAL_OVER_SHORT_AMOUNT else 0 end) as Negative into #Temp from [dbo].[Temp]

    选择 sum(Positive) 作为 PositiveSum,sum(Negative) 作为 NegativeSum 来自#Temp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多