2009-11-09 32 views
19

Tengo una tabla con las siguientes columnas y datos:¿Cómo separar los números positivos y negativos en sus propias columnas?

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

¿Puedo escribir una consulta que se ve en la señal de activity_amt y lo pone en la columna de créditos si es positivo, y la columna de débitos si es negativo ? (Estoy usando Sybase)

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

mayoría de los sistemas de contabilidad evitar números negativos en la base de datos. Tienen dos campos: cantidad que siempre es positiva y un campo de bandera para determinar si la transacción es de débito o crédito. – jmucchiello

+0

Sí, soy consciente de eso. –

+0

buena pregunta n me resolvió un montón de problemas. solo de pasada notaste que cuando agregas un porcentaje positivo a un porcentaje negativo, la red no cuadra ... si un activo sube un 100% y baja un 50%, está en el mismo punto de precio ... espero que consigas lo que quiero decir ... así que se necesita una declaración de caso para agregar números negativos a números positivos y, por lo tanto, ¡una razón más para estar siempre positivos! – user1974729

Respuesta

34
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 
+0

¡Gracias! +1 por ser rápido en el sorteo. –

+0

gracias por la respuesta ... u da mejor! me ayudó muchísimo! – user1974729

5

no estoy seguro acerca de la sintaxis exacta de Sybase, pero usted debería ser capaz de grupo en la fecha y resumir los valores positivos y negativos:

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 
+0

Gracias. Eso funcionó como un encanto. –

+1

Por simetría, que se puede utilizar '<' and '>' sin ningún trauma - los ceros se contarán como ceros ... –

+0

@ Jonathan: Sí, en este caso. Hago una elección activa para usar los operadores complementarios para que se incluyan todos los registros, en caso de que este ejemplo se utilice para algo ligeramente diferente. :) – Guffa

0
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 
0

he encontrado una nueva respuesta a este problema mediante la función DECODE. Espero que esto sea útil para todos.

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; 
Cuestiones relacionadas