FB2, 6.3.0.12654, ODS 11.0, ibexpert 2006.01.30. есть запрос select intervals.name, sum(q1.r_out_md) from intervals left join get_an2(intervals.vdate1,intervals.vdate2) q1 on (intervals.vdate1 between '2005-09-01' and '2006-04-30') group by 1
работает, результат дает. строк в результате - 21. (fetch all, само собой) теперь просто хочу добавить в вывод intervals.vdate1, intervals.vdate2, соответственно запускаю тот же запрос, но добавив эти два поля в select and group by. получаю запрос select intervals.name, intervals.vdate1, intervals.vdate2, sum(q1.r_out_md) from intervals left join get_an2(intervals.vdate1,intervals.vdate2) q1 on (intervals.vdate1 between '2005-09-01' and '2006-04-30') group by 1,2,3 не работает.. ошибка "arithmetic overflow or divizion by zero has occured". хотя с моей колокольни кажется, что ход выполнения данных запросов должен быть идентичен. просто пристегнуты два поля, в которых DATE NOT NULL. на всякий случай содержимое таблицы INTERVALS в PS1, ничего криминального. Планы запросов идентичны (на всякий случай в PS2), что подтверждает мое субъективное ощущение о том, что они выполняются одинаково :) что не так, пока не понял. (используемая в этом запросе процедура - куча заплаток, накопившихся за год, поэтому пока не выделил простой пример с глюкой) может, это что-то известное? есть подозрение, что проблема в том, что из тех 21 строк результата, 13 как sum(q1.r_out_md) выдают null.. но простыми скриптами это подтвердить не удается. время выполнения практически одинаковое (достаточное заметное, порядка 4х минут), что опять же подталкивает к мысли, что ошибка возникает в самый последний момент при группировке и наверняка тут null является проблемой. но в простых случаях группировка с null легко выполняется.. PS1: CREATE TABLE INTERVALS ( ID INTEGER NOT NULL, VDATE1 DATE NOT NULL, VDATE2 DATE NOT NULL, NAME VARCHAR(50) NOT NULL ); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (34958, '2005-01-01', '2005-01-31', '2005 г., январь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (34959, '2005-08-01', '2005-08-31', '2005 г., август'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (34960, '2005-09-01', '2005-09-30', '2005 г., сентябрь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (34961, '2005-10-01', '2005-10-31', '2005 г., октябрь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (42438, '2005-11-01', '2005-11-30', '2005 г., ноябрь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (42439, '2005-12-01', '2005-12-31', '2005 г., декабрь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (66650, '2005-02-01', '2005-02-28', '2005 г., февраль'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (66651, '2005-03-01', '2005-03-31', '2005 г., март'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (66652, '2006-01-01', '2006-01-31', '2006 г., январь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (66653, '2006-02-01', '2006-02-28', '2006 г., февраль'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (74255, '2006-03-01', '2006-03-31', '2006 г., март'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (74256, '2006-04-01', '2006-04-30', '2006 г., апрель'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (81378, '2005-04-01', '2005-04-30', '2005 г., апрель'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (81379, '2006-05-01', '2006-05-31', '2006 г., май'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022510, '2006-06-01', '2006-06-30', '2006 г., июнь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022511, '2006-07-01', '2006-07-31', '2006 г., июль'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022512, '2006-08-01', '2006-08-31', '2006 г., август'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022513, '2006-09-01', '2006-09-30', '2006 г., сентябрь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022514, '2006-10-01', '2006-10-31', '2006 г., октябрь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022515, '2006-11-01', '2006-11-30', '2006 г., ноябрь'); INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022516, '2006-12-01', '2006-12-31', '2006 г., декабрь'); ALTER TABLE INTERVALS ADD CONSTRAINT UNQ1_INTERVALS UNIQUE (NAME); ALTER TABLE INTERVALS ADD CONSTRAINT UNQ2_INTERVALS UNIQUE (VDATE1, VDATE2); ALTER TABLE INTERVALS ADD CONSTRAINT PK_INTERVALS PRIMARY KEY (ID); CREATE INDEX INTERVALS_IDX1 ON INTERVALS (VDATE1); CREATE INDEX INTERVALS_IDX2 ON INTERVALS (VDATE2); PS2: Plan PLAN JOIN (SORT (JOIN (INTERVALS INDEX (INTERVALS_IDX1), RDB$DATABASE NATURAL)), SYSTEMDATA NATURAL)(GET_REST NATURAL)(STORAGES NATURAL)SORT (JOIN (AGENTS NATURAL, SALES_MOVE INDEX (RDB$FOREIGN38)))JOIN (SALES_MOVE INDEX (RDB$FOREIGN36, RDB$FOREIGN37, RDB$FOREIGN37), AGENTS INDEX (RDB$PRIMARY2))(SRV_GET41_V20060512 NATURAL)(SRV_GET41_V20060512 NATURAL)JOIN (INTERVALS INDEX (INTERVALS_IDX1, INTERVALS_IDX2), REAL41 INDEX (PK_REAL41))(SALES_MOVE INDEX (RDB$FOREIGN36, RDB$FOREIGN38))SORT (JOIN (TEMP1 INDEX (TEMP1_IDX3), SORTAMENT INDEX (RDB$PRIMARY15), SGROUP INDEX (RDB$PRIMARY14), SSGROUP INDEX (PK_SSGROUP)))(TEMP1 INDEX (TEMP1_IDX3)) Adapted Plan PLAN JOIN (SORT (JOIN (INTERVALS INDEX (INTERVALS_IDX1), RDB$DATABASE NATURAL)), SYSTEMDATA NATURAL)(GET_REST NATURAL)(STORAGES NATURAL)SORT (JOIN (AGENTS NATURAL, SALES_MOVE INDEX (INTEG_226)))JOIN (SALES_MOVE INDEX (INTEG_224, INTEG_225, INTEG_225), AGENTS INDEX (INTEG_190))(SRV_GET41_V20060512 NATURAL)(SRV_GET41_V20060512 NATURAL)JOIN (INTERVALS INDEX (INTERVALS_IDX1, INTERVALS_IDX2), REAL41 INDEX (PK_REAL41))(SALES_MOVE INDEX (INTEG_224, INTEG_226))SORT (JOIN (TEMP1 INDEX (TEMP1_IDX3), SORTAMENT INDEX (INTEG_203), SGROUP INDEX (INTEG_202), SSGROUP INDEX (PK_SSGROUP)))(TEMP1 INDEX (TEMP1_IDX3)) --~--~---------~--~----~------------~-------~--~----~ -~----------~----~----~----~------~----~------~--~---