Извините, если это стало двойной записью.
Я пишу запрос, который определяет количество клиентов, владеющих акциями в определенном фонде, сгруппированном по дням, когда транзакции происходили с этим фондом.
Итак, моя таблица транзакций:
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 человека и т. д.
Любая помощь?