Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 decode и условие  [new]
Валентина Сычёва
Member

Откуда:
Сообщений: 4
Здравствуйте.
В запросе необходимо суммировать положительные и отрицательные знчения полей.
У меня Oracle8, поэтому нет возможности использовать case.

select CB_ACCT_NO,to_char(value_date,'mm'),
sum(case AMOUNT when amount>0 then amount else 0 end) debet,
sum(case AMOUNT when amount<0 then amount else 0 end) kredit,
.......
Есть ли возможность реализовать подобное с decode?
14 июн 07, 10:39    [4265535]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
Валентина Сычёва
и
Ольга Семенова

Вы, часом, не коллеги? :)

--------------------------------
Вся жизнь -ништяк, все бабы -леди,а солнце -шар дающий свет.
14 июн 07, 10:41    [4265557]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
use sign(AMOUNT)
14 июн 07, 10:42    [4265561]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
Валентина Сычёва
Member

Откуда:
Сообщений: 4
Спасибо
14 июн 07, 10:45    [4265574]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1314
select CB_ACCT_NO,to_char(value_date,'mm'),
sum(DECODE(SIGN(AMOUNT), 1,amount)) debet,
sum(DECODE(SIGN(AMOUNT),-1,amount)) kredit,
...
14 июн 07, 11:24    [4265812]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
oragraf
select CB_ACCT_NO,to_char(value_date,'mm'),
sum(DECODE(SIGN(AMOUNT), 1,amount)) debet,
sum(DECODE(SIGN(AMOUNT),-1,amount)) kredit,
...

А если AMOUNT=0?
14 июн 07, 13:32    [4266691]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
====
Guest
andrey_anonymous
oragraf
select CB_ACCT_NO,to_char(value_date,'mm'),
sum(DECODE(SIGN(AMOUNT), 1,amount)) debet,
sum(DECODE(SIGN(AMOUNT),-1,amount)) kredit,
...

А если AMOUNT=0?


А не пофиг ???.
Зацепит обе суммы.
14 июн 07, 13:38    [4266742]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
====
А не пофиг ???.
Зацепит обе суммы.

:)
На самом деле в данном конкретном случае применительно к SUM пофиг, НО.
Надо помнить, что sign может возвращать три результата - +1, -1 и 0.
При помещении в decode про 0 забывать не стоит.
14 июн 07, 13:46    [4266812]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1314
andrey_anonymous
А если AMOUNT=0?

Про ноль забыл, сыплю пепел...В данном примере, правда, пофигу.
14 июн 07, 15:45    [4267702]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Распространённая ошибка проектирования debet/kredit кодировать знаком числа.

PS. В Оракле sign может возвращать четыре результата - +1, -1, 0 и null.
14 июн 07, 15:55    [4267774]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Прикол:


select sign(-1E-30f/1E30f), (-1E-30f/1E30f) from dual;

                          SIGN(-1E-30F/1E30F)
---------------------------------------------
                              (-1E-30F/1E30F)
---------------------------------------------
                                            1
                                            0

Мало того, что sign вернул не 0, так он вернул и не -1!
14 июн 07, 16:04    [4267841]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
ГостЪ
Guest
mcureenab
Прикол:


select sign(-1E-30f/1E30f), (-1E-30f/1E30f) from dual;

                          SIGN(-1E-30F/1E30F)
---------------------------------------------
                              (-1E-30F/1E30F)
---------------------------------------------
                                            1
                                            0

Мало того, что sign вернул не 0, так он вернул и не -1!

это документировано:)

ORACLE
For binary floating-point numbers (BINARY_FLOAT and BINARY_DOUBLE), this function returns the sign bit of the number. The sign bit is:

-1 if n<0

+1 if n>=0 or n=NaN
14 июн 07, 16:50    [4268186]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
ГостЪ
это документировано:)

ORACLE
For binary floating-point numbers (BINARY_FLOAT and BINARY_DOUBLE), this function returns the sign bit of the number. The sign bit is:

-1 if n<0

+1 if n>=0 or n=NaN

Да как бы не совсем: судя по знаку "-" в слове "-1E-30F" мой тезка пытается эксплуатировать отрицательные числа. Другой вопрос, что он вылезает за границы точности...
14 июн 07, 17:02    [4268306]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
ГостЪ
Guest
andrey_anonymous
ГостЪ
это документировано:)

ORACLE
For binary floating-point numbers (BINARY_FLOAT and BINARY_DOUBLE), this function returns the sign bit of the number. The sign bit is:

-1 if n<0

+1 if n>=0 or n=NaN

Да как бы не совсем: судя по знаку "-" в слове "-1E-30F" мой тезка пытается эксплуатировать отрицательные числа. Другой вопрос, что он вылезает за границы точности...


Т.е. как не совсем, он же получил 0 под знаком? Точность в другом месте документирована:)
14 июн 07, 17:14    [4268395]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
ГостЪ
Guest
Вдогонку - если привести тип к number под знаком, то знак вернет 0...
14 июн 07, 17:15    [4268406]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
andrey_anonymous
Да как бы не совсем: судя по знаку "-" в слове "-1E-30F" мой тезка пытается эксплуатировать отрицательные числа. Другой вопрос, что он вылезает за границы точности...


Не. Всё правильно. Антипереполнение даёт 0, а согласно документации и фактически sign(0f) = 1. В Оракле специальные значения Floating Point немного отличаются от стандартных IEEE754. В частности, -0 is coerced to +0.
14 июн 07, 17:18    [4268430]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
ГостЪ
Вдогонку - если привести тип к number под знаком, то знак вернет 0...


Угу... Тест на вшивость.
14 июн 07, 17:20    [4268449]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
stax..
Guest
mcureenab
Угу... Тест на вшивость.

угу
null вообще не учитываем

дебет і кредит зависит от активный или пасивный счит

а что делать если он (счет) активно-пасивный. во!

ps
при сплошной копююююююютиризации,
двойная запись (она выполнила свою роль) в бухгалтерии
должна быть заменена новой теорией
.....
stax
14 июн 07, 22:06    [4269574]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
stax..
ps
при сплошной копююююююютиризации,
двойная запись (она выполнила свою роль) в бухгалтерии
должна быть заменена новой теорией
.....
stax


Это теория многомерных баз данных, на которой базируются OLAP системы и хранилища данных (Data Warehouse).
Пока двойную запись не отменили, извольте предоставлять отчётность в соответствии с требованиями фискальных органов.
В класических системах с двойной записью давно используются аналитические регистры.
14 июн 07, 23:18    [4269746]     Ответить | Цитировать Сообщить модератору
 Re: decode и условие  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Да и технически двойная запись в чистом виде используется далеко не всегда. Я чаще втречал системы, где операция регистрируется одной записью, с указанием двух бухгалтерских счетов и прочих аналитических параметров. Такой подход исключает дублирование информации и проблему несходящегося баланса, но требует всякоразных decode чтобы правильно разложить суммы.
14 июн 07, 23:26    [4269758]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить