Как разделить положительные и отрицательные числа в свои столбцы?

У меня есть таблица со следующими столбцами и данными:

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

Могу ли я написать запрос, который смотрит на знак activity_amt и помещает его в столбец кредитов, если он положительный, и в столбец дебетов, если он отрицательный? (Я использую Sybase)

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

person Mike Sickler    schedule 09.11.2009    source источник
comment
Большинство систем учета избегают отрицательных чисел в базе данных. У них есть два поля: сумма, которая всегда положительна, и поле флага, указывающее, является ли транзакция дебетовой или кредитовой.   -  person jmucchiello    schedule 09.11.2009
comment
Ага - я в курсе.   -  person Mike Sickler    schedule 09.11.2009
comment
хороший вопрос решил мне много проблем. мимоходом вы заметили, что когда вы добавляете положительный процент к отрицательному проценту, чистая сумма не выравнивается ... если актив растет на 100% и падает на 50%, они находятся в одной и той же ценовой категории ... я надеюсь, что вы получите что я имею в виду .. так что это как бы требует оператора case для добавления отрицательных чисел к положительным числам и, следовательно, еще одна причина всегда оставаться положительным !!!!   -  person Raghavan    schedule 05.07.2013


Ответы (3)


Я не уверен в точном синтаксисе 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
person Guffa    schedule 09.11.2009
comment
Для симметрии вы можете использовать '‹' и '›' без какой-либо травмы - нули будут считаться нулями... - person Jonathan Leffler; 09.11.2009
comment
@ Джонатан: Да, в этом случае. Я делаю активный выбор использования дополнительных операторов, чтобы включить все записи, на случай, если этот пример будет использоваться для чего-то немного другого. :) - person Guffa; 09.11.2009
comment
спасибо Джон! да, но как вы уверены, что если вы оставите 0, запись будет засчитана, в этом случае имеет смысл просто добавить 0, но тогда этот простой выбор может фактически включать отклонение от среднего, как в сумме ( случай, когда activity_amt > 0, тогда activity_amt = activity_amt - MEAN_OF_A_SET_OF_NUMBERS, иначе ....... симметрично я бы сделал случай, когда amt > 0, случай, когда amt‹0 и случай, когда amt = 0, и случай, когда amt равен NULL.. это всегда имеет смысл сначала исключить граничные условия из уравнения, еще немного кода, еще немного часов, но вы возвращаетесь домой с рубашкой! - person Raghavan; 05.07.2013
comment
@user1974729: user1974729: Если хотите, вы можете суммировать и другие вещи, но ОП спрашивал только о положительных и отрицательных суммах. - person Guffa; 05.07.2013
comment
полный кредит для вас за то, что вы указали, что 0 будет учитываться, а NULL не будет учитываться вообще. требуется большой опыт, чтобы понять, что out.im навсегда запутался с граничными условиями 0, NULL, потому что они всегда возвращаются, чтобы причинить мне боль, и поэтому я рекомендовал использовать оператор 0 отдельно для таких пользователей, как я, а не для продвинутых пользователей, таких как у кого это прикрыто.. - person Raghavan; 05.07.2013

Я нашел новый ответ на эту проблему, используя функцию 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;
person Mihir Kale    schedule 27.07.2013

person    schedule
comment
Спасибо! +1 за быстроту розыгрыша. - person Mike Sickler; 09.11.2009