Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

Помогите разобраться с SUM

$
0
0
В программе была ошибка с отчетами (неправильно могли начисляться суммы). Программу исправили и теперь чтобы найти разницу и откорректировать суммы (доплатить/снять):
1. беру старые данные начислений, суммирую по столбцам с суммами (sm1-8) чтобы по ключевым полям CODE, NUMB, RASH получить 1 строчку.
2. Тоже само что и в п.1, только с новыми данными.
3. После этого отнимаю один список от другого.

В целом все ХОРОШО, но вот есть одна загвоздка которую не могу решить.
По какой-то причине в результате я получаю 1956 строк, которые попарно сначала сумма +, а потом -. В сумме оно дает 0,00.
Не могу избавиться от этого.
Что неправильно делаю?

Исходные данные:
+

Таблица со старыми данными начислений (которые формировались ежемесячно):
CREATE TABLE RJ_OLD (
    CODE  INTEGER,
    NUMB  BIGINT,
    RASH  VARCHAR(15),
    SM1   DECIMAL(9,2),
    SM2   DECIMAL(9,2),
    SM3   DECIMAL(9,2),
    SM4   DECIMAL(9,2),
    SM5   DECIMAL(9,2),
    SM6   DECIMAL(9,2),
    SM7   DECIMAL(9,2),
    SM8   DECIMAL(9,2)
);

INSERT INTO RJ_OLD (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119481', 0, 0, 0, 0, 0, 18.85, 0, 0);
INSERT INTO RJ_OLD (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119481', 0, 0, 0, 0, 0, 18.85, 0, 0);
INSERT INTO RJ_OLD (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119481', 0, 0, 0, 0, 0, 18.85, 0, 0);
INSERT INTO RJ_OLD (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119481', 0, 0, 0, 0, 0, 101.06, 0, 0);
INSERT INTO RJ_OLD (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119461', 0, 0, 0, 0, 0, 101.06, 0, 0);
INSERT INTO RJ_OLD (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119461', 0, 0, 0, 0, 0, 101.06, 0, 0);

Таблица с новыми данными начислений (переформированные данные помесячно после исправления ошибки):
CREATE TABLE RJ_NEW (
    CODE  INTEGER,
    NUMB  BIGINT,
    RASH  VARCHAR(15),
    SM1   DECIMAL(9,2),
    SM2   DECIMAL(9,2),
    SM3   DECIMAL(9,2),
    SM4   DECIMAL(9,2),
    SM5   DECIMAL(9,2),
    SM6   DECIMAL(9,2),
    SM7   DECIMAL(9,2),
    SM8   DECIMAL(9,2)
);

INSERT INTO RJ_NEW (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119481', 0, 0, 0, 0, 0, 18.85, 0, 0);
INSERT INTO RJ_NEW (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119481', 0, 0, 0, 0, 0, 18.85, 0, 0);
INSERT INTO RJ_NEW (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119481', 0, 0, 0, 0, 0, 18.85, 0, 0);
INSERT INTO RJ_NEW (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119461', 0, 0, 0, 0, 0, 101.06, 0, 0);
INSERT INTO RJ_NEW (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119461', 0, 0, 0, 0, 0, 101.06, 0, 0);
INSERT INTO RJ_NEW (CODE, NUMB, RASH, SM1, SM2, SM3, SM4, SM5, SM6, SM7, SM8) VALUES (26, 500315, '162119461', 0, 0, 0, 0, 0, 101.06, 0, 0);



Выполняю запрос на суммирование:
+

  select
    code,
    numb,
    rash,
    sum(sm1) as sm1,
    sum(sm2) as sm2,
    sum(sm3) as sm3,
    sum(sm4) as sm4,
    sum(sm5) as sm5,
    sum(sm6) as sm6,
    sum(sm7) as sm7,
    sum(sm8) as sm8
from
    rj_new
group by code, numb, rash

Получаю такой результат:
CODE	NUMB	RASH	SM1	SM2	SM3	SM4	SM5	SM6	SM7	SM8
26	500315	162119461	0	0	0	0	0	303.18	0	0
26	500315	162119481	0	0	0	0	0	56.55	0	0



Почему получается 2 строчки. Думал может пробел в поле RASH (Хотя по командам INSERT уже видно что его нет). Прогнал обе таблицы trim(rash). Результат не изменился.
Попробовал сделать индекс на обе таблицы:
CREATE INDEX IDX_RJ_NEW_RAX ON RJ_NEW (CODE, NUMB, RASH);
CREATE INDEX IDX_RJ_OLD_RAX ON RJ_OLD (CODE, NUMB, RASH);
Результат не изменился.
Исходные таблицы содержат много данных (по 5млн. строк каждая), решил повторить только на описанных выше примерах - результат не изменился: при суммировании получаю в результат 2 строчки.


--------------------------
Firebird 3.0.1.32609;
IBExpert 2017.2.7.1;
Windows 10 32-bit;
4Gb RAM;
SSD 512Mb + HDD 1 Tb;
Настройки по умолчанию

Viewing all articles
Browse latest Browse all 1677

Trending Articles