如何将正数和负数分成各自的列?

Posted

技术标签:

【中文标题】如何将正数和负数分成各自的列?【英文标题】:How to separate positive and negative numbers into their own columns? 【发布时间】:2010-12-14 12:05:13 【问题描述】:

我有一个包含以下列和数据的表格:

activity_dt | activity_amt
 2009-01-01 |   -500
 2009-01-01 |    750

我是否可以编写一个查询来查看activity_amt 的符号,如果它是正数则将它放在贷方列中,如果它是负数则将它放在借方列中? (我正在使用 Sybase)

activity_dt | debits | credits
 2009-01-01 |  -500  |   750

【问题讨论】:

大多数会计系统避免在数据库中使用负数。它们有两个字段:金额始终为正数,以及交易是借记还是贷记的标志字段。 是的,我知道这一点。 很好的问题解决了我很多问题。顺便说一句,您是否注意到,当您将正百分比添加到负百分比时,净值不会平方...如果资产上涨 100% 并下跌 50%,它们处于相同的价格点.. 我希望你得到我的意思是..所以它有点需要一个案例陈述来将负数添加到正数,因此还有一个理由总是保持积极!!!! 【参考方案1】:
select activity_dt, 
    sum(case when activity_amt < 0 then activity_amt else 0 end) as debits, 
    sum(case when activity_amt > 0 then activity_amt else 0 end) as credits
from the_table
group by activity_dt
order by activity_dt

【讨论】:

谢谢! +1 快速抽签。【参考方案2】:

我不确定 Sybase 中的确切语法,但您应该能够按日期分组并总结正负值:

select
  activity_dt,
  sum(case when activity_amt < 0 then activity_amt else 0 end) as debits,
  sum(case when activity_amt >= 0 then activity_amt else 0 end) as credits
from
  theTable
group by
  activity_dt

【讨论】:

为了对称,你可以使用 '' 而不会造成任何创伤 - 零将被视为零... @Jonathan:是的,在这种情况下。我主动选择使用补充运算符,以便包含所有记录,以防此示例用于稍有不同的内容。 :) 感谢乔恩!是的,但是如何确定如果您将 0 排除在外,则记录将被计算在内,在这种情况下,这是有道理的,因为您只是将 0 相加,但是这个简单的选择实际上可能涉及与平均值的变化,如总和(当 activity_amt > 0 时 activity_amt = activity_amt - MEAN_OF_A_SET_OF_NUMBERS 否则 .. 对称地我会做 amt > 0 时的情况,amt @user1974729:你可以总结更多的东西,但OP只问了正负数。 完全感谢您指出将计算 0 而根本不会计算 NULL。这需要很多经验才能弄清楚。我永远对 0 的边界条件感到困惑,NULL 因为他们总是回来伤害我,所以我建议像我这样的用户单独使用 0 语句,而不是像这样的高级用户你有它覆盖..【参考方案3】:
select (select JV_GroupsHead.GroupTitle
         from JV_GroupsHead
         whereJV_GroupsHead.Id=jv.GroupId) as 'GroupName'
        ,jv.Revenue
        ,jv.AccountNo
        ,jv.AccountNoTitle
        ,(case when jv.Revenue  < 0 then jv.Revenue  else 0 end) as 'debits'
        ,(case when jv.Revenue> 0 then jv.Revenue  else 0 end) as 'credits'
from JVFunction1('2010-07-08','2010-08-08') as jv

【讨论】:

【参考方案4】:

我使用DECODE 函数找到了这个问题的新答案。 我希望这对每个人都有用。

select activity_dt, 
sum((DECODE(activity_amt /-ABS(activity_amt), 1, activity_amt, 0))) as credits,
sum((DECODE(activity_amt /-ABS(activity_amt), -1, activity_amt, 0))) as debits
from the_table
group by activity_dt
order by activity_dt;

【讨论】:

以上是关于如何将正数和负数分成各自的列?的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 列转换具有正数和负数的字符串

javascript 负数 怎么取 让正数变成负数

js如何判断一个数字是正数还是负数

如何对表示数字(正数和负数以及小数部分)的字符串数组进行排序?

ARM汇编求正数负数个数

Excel 中的 IFS 公式:公式将分类正数但不分类负数