Jest sobie struktura w bazie danych
9-010-011
-012
-100
-200-01
-02
-400
Typowy plan kont
Każde ostatnie "konto" ma zapisy które muszą być przeliczone jako pierwsze.
Do tej pory robiłem to pojedynczym sql
UPDATE plankont1 AS plan SET
saldown5=(SELECT CASE WHEN ((coalesce(SUM(kwotawn),0)+coalesce(plan.otwarciewn,0))-(coalesce(SUM(kwotama),0)+coalesce(plan.otwarciema,0)))=0 THEN 0
WHEN ((coalesce(SUM(kwotawn),0)+coalesce(plan.otwarciewn,0))-(coalesce(SUM(kwotama),0)+coalesce(plan.otwarciema,0)))>0 THEN
(coalesce(SUM(kwotawn),0)+coalesce(plan.otwarciewn,0))-(coalesce(SUM(kwotama),0)+coalesce(plan.otwarciema,0))
WHEN ((coalesce(SUM(kwotawn),0)+coalesce(plan.otwarciewn,0))-(coalesce(SUM(kwotama),0)+coalesce(plan.otwarciema,0)))<0 THEN 0
END from ksiegizapisy1 where rpad(numerkonta,10, 'X') LIKE CASE WHEN kontonad='9' THEN plan.numerkonta||'%'
WHEN kontonad<>'9' THEN rpad(plan.numerkonta,10, 'X')||'%'
END
and ksiegizapisy1.rok=2018 and ksiegizapisy1.miesiac<=:mies),
saldoma5=(SELECT CASE WHEN ((coalesce(SUM(kwotawn),0)+coalesce(plan.otwarciewn,0))-(coalesce(SUM(kwotama),0)+coalesce(plan.otwarciema,0)))=0 THEN 0
WHEN ((coalesce(SUM(kwotawn),0)+coalesce(plan.otwarciewn,0))-(coalesce(SUM(kwotama),0)+coalesce(plan.otwarciema,0)))>0 THEN 0
WHEN ((coalesce(SUM(kwotawn),0)+coalesce(plan.otwarciewn,0))-(coalesce(SUM(kwotama),0)+coalesce(plan.otwarciema,0)))<0 THEN
(coalesce(SUM(kwotama),0)+coalesce(plan.otwarciema,0))-(coalesce(SUM(kwotawn),0)+coalesce(plan.otwarciewn,0))
END from ksiegizapisy1 where rpad(numerkonta,10, 'X') LIKE CASE WHEN kontonad='9' THEN plan.numerkonta||'%'
WHEN kontonad<>'9' THEN rpad(plan.numerkonta,10, 'X')||'%'
END
and ksiegizapisy1.rok=2018 and ksiegizapisy1.miesiac<=:mies) ,
obrotywn5= (SELECT coalesce(SUM(kwotawn),0)
from ksiegizapisy1 where rpad(numerkonta,10, 'X') LIKE
CASE WHEN kontonad='9' THEN plan.numerkonta||'%'
WHEN kontonad<>'9' THEN rpad(plan.numerkonta,10, 'X')||'%'
END
and ksiegizapisy1.rok=:rok and ksiegizapisy1.miesiac=:mies) ,
obrotyma5= (SELECT coalesce(SUM(kwotama),0)
from ksiegizapisy1 where rpad(numerkonta,10, 'X') LIKE
CASE WHEN kontonad='9' THEN plan.numerkonta||'%'
WHEN kontonad<>'9' THEN rpad(plan.numerkonta,10, 'X')||'%'
END
and ksiegizapisy1.rok=:rok and ksiegizapisy1.miesiac=:mies) ,
obrotynarawn5= (SELECT coalesce(SUM(kwotawn),0)
from ksiegizapisy1 where rpad(numerkonta,10, 'X') LIKE
CASE WHEN kontonad='9' THEN plan.numerkonta||'%'
WHEN kontonad<>'9' THEN rpad(plan.numerkonta,10, 'X')||'%'
END
and ksiegizapisy1.rok=:rok and ksiegizapisy1.miesiac<=:mies) ,
obrotynarama5= (SELECT coalesce(SUM(kwotama),0)
from ksiegizapisy1 where rpad(numerkonta,10, 'X') LIKE
CASE WHEN kontonad='9' THEN plan.numerkonta||'%'
WHEN kontonad<>'9' THEN rpad(plan.numerkonta,10, 'X')||'%'
END
and ksiegizapisy1.rok=:rok and ksiegizapisy1.miesiac<=:mies) WHERE rok=:rok
and (
numerkonta = '202-1'
OR numerkonta = '221'
OR numerkonta = '400'
OR numerkonta = '202'
);
Jest dość długi i skomplikowany
Query returned successfully: 0 rows affected, 171 msec execution time.
Pytanie czy można zrobić to lepiej/szybciej? Może powinno się to zrobić lepiej.
A może odwzorować na obiekty c#?
Struktura tabeli plankont
CREATE TABLE plankont1
(
id serial NOT NULL,
numerkonta character varying(15),
nazwakonta character varying(200),
kontonad character varying(15),
typkonta character varying(20),
persaldo boolean DEFAULT false,
otwarciewn numeric(22,2) DEFAULT 0,
otwarciema numeric(22,2) DEFAULT 0,
saldown1 numeric(22,2) DEFAULT 0,
saldoma1 numeric(22,2) DEFAULT 0,
...
saldown12 numeric(22,2) DEFAULT 0,
saldoma12 numeric(22,2) DEFAULT 0,
obrotywn1 numeric(22,2) DEFAULT 0,
obrotyma1 numeric(22,2) DEFAULT 0,
...
obrotywn12 numeric(22,2) DEFAULT 0,
obrotyma12 numeric(22,2) DEFAULT 0,
obrotynarawn1 numeric(11,2) DEFAULT 0,
obrotynarama1 numeric(11,2) DEFAULT 0,
...
obrotynarawn12 numeric(11,2) DEFAULT 0,
obrotynarama12 numeric(11,2) DEFAULT 0,
rok integer
)
Struktura tabeli ksiegizapisy1
CREATE TABLE ksiegizapisy1
(
id serial NOT NULL,
main_id integer,
numerkonta character varying(15),
idd character varying(60),
miesiac integer,
rok integer,
numerdokumentu character varying(40),
data date,
kontrachent character varying(255),
opis character varying(256),
kontoprze character varying(15),
kwotawn numeric(15,2),
kwotama numeric(15,2),
bufor character varying(15),
dok_nag_id integer,
dok_cialo_id integer
)