Я пишу запрос, который определяет количество клиентов, владеющих акциями в определенном фонде, сгруппированных по дням транзакций, произошедших с этим фондом.
Итак, моя таблица транзакций:
CREATE TABLE trans(
transID SERIAL PRIMARY KEY,
sin CHAR(9) REFERENCES customer(sin) ON UPDATE CASCADE ON DELETE CASCADE,
fundID INT REFERENCES fund(fundID) NOT NULL,
transDate DATE,
shares INT,
FOREIGN KEY (fundID) REFERENCES fund(fundID) ON UPDATE CASCADE ON DELETE CASCADE
);
Вот мой запрос:
select f.transdate, count (f.sin)
from (select t1.transdate, t1.sin, sum(t2.shares)
from fund f natural join trans t1 natural join trans t2
where f.fundname='Energy'
and t1.sin = t2.sin
and t2.transdate <= t1.transdate
group by t1.transdate, t1.sin
having sum(t2.shares) > 0)as f group by f.transdate
order by f.transdate;
Возвращает общее количество клиентов, владеющих акциями в этот день. Однако я также хочу добавить клиентов, которые держали акции в одном и том же фонде все дни раньше.
Так скажем, если я добавлю следующие вставки:
INSERT INTO trans VALUES (DEFAULT, '1', '3', '2011-10-10', 400);
INSERT INTO trans VALUES (DEFAULT, '3', '3', '2011-10-11', 324);
INSERT INTO trans VALUES (DEFAULT, '5', '3', '2011-10-17', 201);
INSERT INTO trans VALUES (DEFAULT, '8', '3', '2011-10-17', 472);
Итак, запрос, который я сформулировал, вернет это:
transdate | count
------------+-------
2011-10-10 | 1
2011-10-11 | 1
2011-10-17 | 2
Однако я бы хотел, чтобы это было так:
transdate | count
------------+-------
2011-10-10 | 1
2011-10-11 | 2
2011-10-17 | 4
Как видите, в конце 2011-10-11 гг. В этом фонде находилось 2 человека и т. Д.
Любая помощь?