:: Visual Foxpro, Foxpro for DOS
Как побороть неточность в запросе
Артём

Сообщений: 143
Дата регистрации: 23.04.2001
такой вот запрос
SELECT MONTH(date) AS m_date, YEAR(date) AS y_date,;
SUM( IIF( payer=nAN, -summa, 0)) AS expense,;
SUM( IIF( recipient=nAN, summa, 0)) AS incoming;
FROM bank_oper;
GROUP BY y_date, m_date;
INTO CURSOR by_month_s09
откидывает дробную часть. зависит это откидывание от первого значения в результате запроса. если первая строка expence = 123456.00, то и весь столбик получается с нулями.
как это исправить?
например. если добавить , 0.01 то с вероятностью 99% , будет получаться неокругленный ответ.
[code]SELECT MONTH(date) AS m_date, YEAR(date) AS y_date,;
SUM( IIF( payer=nAN, -summa, 0))+0.01 AS expense,;
SUM( IIF( recipient=nAN, summa, 0))+0.01 AS incoming;
FROM bank_oper;
GROUP BY y_date, m_date;
INTO CURSOR by_month_s09
[/code]


Исправлено 1 раз(а). Последнее : Артём, 29.11.24 13:43
Ratings: 0 negative/0 positive
Re: Как побороть неточность в запросе
Alsim

Сообщений: 3680
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
SELECT MONTH(date) AS m_date, YEAR(date) AS y_date,;
SUM( IIF( payer=nAN, -summa, 000000000000.00)) AS expense,;
SUM( IIF( recipient=nAN, summa, 000000000000.00)) AS incoming;
FROM bank_oper;
GROUP BY y_date, m_date;
INTO CURSOR by_month_s09
Ratings: 0 negative/2 positive
Re: Как побороть неточность в запросе
PaulWist

Сообщений: 14727
Дата регистрации: 01.04.2004
На привести к явному типу данных

SELECT MONTH(date) AS m_date, YEAR(date) AS y_date,;
cast(SUM( IIF( payer=nAN, -summa, 0)) as N(12,2)) AS expense,;
cast(SUM( IIF( recipient=nAN, summa, 0)) as N(12, 2)) AS incoming;
FROM bank_oper;
GROUP BY y_date, m_date;
INTO CURSOR by_month_s09


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Как побороть неточность в запросе
Артём

Сообщений: 143
Дата регистрации: 23.04.2001
Alsim
SELECT MONTH(date) AS m_date, YEAR(date) AS y_date,;
SUM( IIF( payer=nAN, -summa, 000000000000.00)) AS expense,;
SUM( IIF( recipient=nAN, summa, 000000000000.00)) AS incoming;
FROM bank_oper;
GROUP BY y_date, m_date;
INTO CURSOR by_month_s09
спасибо. так получилось. даже 0,00 хватило


Исправлено 1 раз(а). Последнее : Артём, 29.11.24 14:11
Ratings: 0 negative/0 positive
Re: Как побороть неточность в запросе
Артём

Сообщений: 143
Дата регистрации: 23.04.2001
PaulWist
На привести к явному типу данных
SELECT MONTH(date) AS m_date, YEAR(date) AS y_date,;
cast(SUM( IIF( payer=nAN, -summa, 0)) as N(12,2)) AS expense,;
cast(SUM( IIF( recipient=nAN, summa, 0)) as N(12, 2)) AS incoming;
FROM bank_oper;
GROUP BY y_date, m_date;
INTO CURSOR by_month_s09
Спасибо. каст я пробовал. так не работает. и round еще пробовал.



Исправлено 1 раз(а). Последнее : Артём, 29.11.24 14:12
Ratings: 0 negative/0 positive
Re: Как побороть неточность в запросе
PaulWist

Сообщений: 14727
Дата регистрации: 01.04.2004
Артём
Спасибо. каст я пробовал. так не работает. и round еще пробовал.

Внести надо в sum(), что бы складывал приведенный тип

SELECT MONTH(date) AS m_date, YEAR(date) AS y_date,;
SUM( IIF( payer=nAN, cast(-summa as N(12,2)), cast(0 as N(12,2)))) AS expense,;
SUM( IIF( payer=nAN, cast(summa as N(12,2)), cast(0 as N(12,2)))) AS incoming;
FROM bank_oper;
GROUP BY y_date, m_date;
INTO CURSOR by_month_s09


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/1 positive
Re: Как побороть неточность в запросе
akvvohinc
Автор

Сообщений: 4485
Откуда: Москва
Дата регистрации: 11.11.2008
PaulWist
Внести надо в sum(), что бы складывал приведенный тип
А если сделать один CAST для результата IIF()?
SUM( CAST( IIF(payer=nAN, -summa, 0) as N(12,2) ) ) AS expense,;
Ratings: 0 negative/0 positive
Re: Как побороть неточность в запросе
danton1973

Сообщений: 161
Откуда: Пермь
Дата регистрации: 10.08.2020
я в таких случаях сначала создаю курсор с нужными типами полей и размерностью, а потом в него insert
Ratings: 0 negative/0 positive
Re: Как побороть неточность в запросе
akvvohinc
Автор

Сообщений: 4485
Откуда: Москва
Дата регистрации: 11.11.2008
danton1973
я в таких случаях сначала создаю курсор с нужными типами полей и размерностью, а потом в него insert
Это не поможет, так как дело не в том, куда кладется, а что кладется.

Если я правильно понял, то вот ваш вариант - запустите:
CREATE CURSOR curs1 (field1 N(5,2))
INSERT INTO curs1 VALUES (1)
INSERT INTO curs1 VALUES (1.29)
* без CAST()
CREATE CURSOR curs2 (field1 N(5,2))
INSERT INTO curs2 SELECT SUM(IIF(field1=1,1,field1)) as field1 FROM curs1
SELECT curs2
BROWSE FIELDS field1 :H='без CAST'
* с CAST()
CREATE CURSOR curs2 (field1 N(5,2))
INSERT INTO curs2 SELECT SUM(CAST(IIF(field1=1,1,field1) as N(5,2))) as field1 FROM curs1
SELECT curs2
BROWSE FIELDS field1 :H='с CAST'
* снова без CAST()
CREATE CURSOR curs2 (field1 N(5,2))
INSERT INTO curs2 SELECT SUM(IIF(field1=1,1,field1)) FROM curs1 as field1
SELECT curs2
BROWSE FIELDS field1 :H='без CAST'
Ratings: 0 negative/0 positive
Re: Как побороть неточность в запросе
PaulWist

Сообщений: 14727
Дата регистрации: 01.04.2004
akvvohinc
PaulWist
Внести надо в sum(), что бы складывал приведенный тип
А если сделать один CAST для результата IIF()?
SUM( CAST( IIF(payer=nAN, -summa, 0) as N(12,2) ) ) AS expense,;

У ТСа не взлетело


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Как побороть неточность в запросе
akvvohinc
Автор

Сообщений: 4485
Откуда: Москва
Дата регистрации: 11.11.2008
PaulWist
У ТСа не взлетело
Паша, как говорится - найдите десять отличий!
У тебя там код отличается от моего - CAST в другом месте.
Ratings: 0 negative/0 positive
Re: Как побороть неточность в запросе
PaulWist

Сообщений: 14727
Дата регистрации: 01.04.2004
Аааа, ну да.



------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 17 (Гостей: 17)

© 2000-2024 Fox Club 
Яндекс.Метрика