2009-11-09 12 views
19

Mam tabelę z następującymi kolumnami i danych:Jak oddzielać liczby dodatnie i ujemne w swoich kolumnach?

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

mogę napisać kwerendę, która wygląda na znak activity_amt i umieszcza ją w kolumnie kredytów, czy to pozytywne, a kolumny zapłaty jeśli jest ujemna ? (Używam Sybase)

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

Większość systemów księgowych unika numerów ujemnych w bazie danych. Mają dwa pola: kwota, która zawsze jest dodatnia i pole flagi, czy transakcja jest obciążeniem czy kredytem. – jmucchiello

+0

Tak, wiem o tym. –

+0

ładne pytanie n rozwiązało mnie wiele problemów. tylko na marginesie zauważyłeś, że kiedy dodasz dodatni procent do ujemnego procentu, sieć się nie zgadza ... jeśli zasób wzrośnie o 100% i spadnie o 50%, są one w tej samej cenie .. mam nadzieję, że dostaniesz co mam na myśli .. więc to trochę wymaga instrukcji case dla dodawania liczb ujemnych do liczb dodatnich, a więc jeszcze jeden powód, aby zawsze pozostać pozytywnym !!!! – user1974729

Odpowiedz

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

Dzięki! +1 za bycie szybkim w losowaniu. –

+0

dzięki za odpowiedź. U da best! pomógł mi niezmiernie! – user1974729

5

nie jestem pewien co do dokładnej składni w Sybase, ale powinieneś być w stanie do grupy na dzień i podsumować dodatnie i ujemne wartości:

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

Dzięki. To działało jak urok. –

+1

Dla symetrii można użyć "<' and '>" bez żadnego urazu - zera będą liczone jako zera ... –

+0

@ Jonathan: Tak, w tym przypadku. Aktywnie wybieram operatory dopełniające, aby uwzględnić wszystkie rekordy, na wypadek gdyby ten przykład był użyty dla czegoś innego. :) – 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

znalazłem nową odpowiedź na ten problem przy użyciu funkcji DECODE. Mam nadzieję, że okaże się to przydatne dla wszystkich.

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; 
Powiązane problemy