Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Неправильный расчет выражений в SQL


Страницы:   1 2

Delphi basic ©   (2006-09-01 10:59:00) 

В Firebird выполняю следующий запрос:

select (ts.moto_hour * c.fuel_norm_moto), c.fuel_norm_moto, ts.moto_hour
from travel_sheet ts, car c, subdivision s
where ts.car = c.ui and
  ts.subdivision = s.ui and
  extract(month from ts.work_date) = 7 and
  extract(year from ts.work_date) = 2006 and
  s.code = 'СМИТ' and
  ts.state = 1

результаты:

150   20   7,5
 75   20   3,8
 60    6      6
 60   20     3

почему выражение (1-й столбец) неправильно считается?
Чего-то я не понимаю :(


Delphi basic   (2006-09-01 12:16:00) [21]

У меня та же версия FB, но без CAST'ов упорно не хочет правильно считать.


Desdechado   (2006-09-01 12:10:00) [22]

провел эксперимент на FB 1.5.3

таблицы:
CREATE TABLE CAR (
   UI              INTEGER NOT NULL,
   FUEL_NORM_MOTO  NUMERIC(5,1) NOT NULL
);

UI  FUEL_NORM_MOTO  
1          20,000  
2          20,000  
3           6,000  
4          20,000  

CREATE TABLE TRAVEL_SHEET (
   UI         INTEGER NOT NULL,
   MOTO_HOUR  NUMERIC(10,1) DEFAULT 0 NOT NULL
);

UI  MOTO_HOUR  
1      7,500  
2      3,800  
3      6,000  
4      3,000  

запрос:
select (ts.moto_hour * c.fuel_norm_moto), c.fuel_norm_moto, ts.moto_hour
from travel_sheet ts, car c
where ts.ui = c.ui

получил такое
F_1      FUEL_NORM_MOTO  MOTO_HOUR  
150,000          20,000      7,500  
76,000          20,000      3,800  
36,000           6,000      6,000  
60,000          20,000      3,000  

делаем выводы...

PS AFAIR, операнды автоматически приводятся к большему типу


Delphi basic   (2006-09-01 11:51:00) [23]

Я знаю, но "каждому свое" ©
В смысле проекту в зависимости от масштаба.
На оракле у нас корпоративная АСУ - тот еще мастодонтище :)


ANB   (2006-09-01 11:43:00) [24]


> Delphi basic ©   (01.09.06 11:35) [5]

В оракле такие проблемы не возникают :)


Delphi basic   (2006-09-01 11:35:00) [25]

Вот так считает правильно:

select (cast(ts.moto_hour as numeric(10, 1)) * cast(c.fuel_norm_moto as numeric(10, 1))), c.fuel_norm_moto, ts.moto_hour,
ts.UI, ts.car
 from travel_sheet ts, car c, subdivision s
 where ts.car = c.ui and
   ts.subdivision = s.ui and
   extract(month from ts.work_date) = 7 and
   extract(year from ts.work_date) = 2006 and
   s.code = 'СМИТ' and
   ts.state = 1

Это что ж, получается, придется обязательно к одному типу приводить, чтобы получить корректный результат?


Delphi basic   (2006-09-01 11:18:00) [26]

У всех они по UI построены.


ANB   (2006-09-01 11:16:00) [27]

Эта, первичные ключи неплохо бы еще напечатать . . .


Delphi basic   (2006-09-01 11:14:00) [28]

ОК, вот:

1-я табл

CREATE TABLE TRAVEL_SHEET (
   UI                  INTEGER NOT NULL,
   CAR                 INTEGER NOT NULL,
   DRIVER              INTEGER NOT NULL,
   SUBDIVISION         INTEGER NOT NULL,
   EXPENSE_CIPHER      INTEGER NOT NULL,
   PREFIX              VARCHAR(10) NOT NULL,
   NUMBER              INTEGER NOT NULL,
   BEGIN_DATE          DATE NOT NULL,
   END_DATE            DATE NOT NULL,
   STATE               INTEGER NOT NULL,
   WORK_DATE           DATE NOT NULL,
   SPEEDOMETER_BEFORE  INTEGER NOT NULL,
   SPEEDOMETER_AFTER   INTEGER NOT NULL,
   REMAINDER_BEFORE    NUMERIC(10,3) NOT NULL,
   REMAINDER_AFTER     NUMERIC(10,3) NOT NULL,
   KM_CITY             INTEGER DEFAULT 0 NOT NULL,
   KM_CITY_CARGO       INTEGER DEFAULT 0 NOT NULL,
   CITY_CARGO          NUMERIC(10,1) DEFAULT 0 NOT NULL,
   KM_HIGHWAY          INTEGER DEFAULT 0 NOT NULL,
   KM_HIGHWAY_CARGO    INTEGER DEFAULT 0 NOT NULL,
   HIGHWAY_CARGO       NUMERIC(10,1) DEFAULT 0 NOT NULL,
   KM_FIELD            INTEGER DEFAULT 0 NOT NULL,
   MOTO_HOUR           NUMERIC(10,1) DEFAULT 0 NOT NULL,
   FUEL_ISSUED         NUMERIC(10,3) DEFAULT 0 NOT NULL,
   MECH_HOUR           NUMERIC(10,1) DEFAULT 0 NOT NULL,
   FUEL_USED           NUMERIC(10,3) DEFAULT 0 NOT NULL
);

2-я табл:
CREATE TABLE CAR (
   UI                 INTEGER NOT NULL,
   MARK               INTEGER NOT NULL,
   CAR_TYPE           INTEGER NOT NULL,
   DRIVER             INTEGER NOT NULL,
   GSM_CARD           INTEGER NOT NULL,
   SUBDIVISION        INTEGER NOT NULL,
   GSM_TYPE           INTEGER NOT NULL,
   GOS_NUMBER         VARCHAR(10) NOT NULL,
   YEAR_ISSUE         INTEGER NOT NULL,
   USAGE_BEGIN        DATE,
   USAGE_END          DATE,
   FUEL_NORM          NUMERIC(5,1) NOT NULL,
   FUEL_NORM_MOTO     NUMERIC(5,1) NOT NULL,
   GARAGE_NUMBER      VARCHAR(10),
   AVERAGE_SPEED      INTEGER DEFAULT 40 NOT NULL,
   NO_USE_CORR_COEFF  INTEGER DEFAULT 0 NOT NULL
);

куски данных как-то неудобочитаемы будут, особенно для 1-й табл.


ANB   (2006-09-01 11:06:00) [29]

приведи DDL всех таблиц и куски данных.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо