Вы должны рассмотреть возможность объединения столбцов perf_date date
и perf_time time
в один timestamp
столбец:
perf_timestamp timestamp
Если вам нужен date
или time
из временной метки просто приведите его так:
SELECT perf_timestamp::time;
SELECT perf_timestamp::date;
Я бы вообще предложил использовать суррогатные первичные ключи.Название «шоу» (название фильма) не является естественным ключом - оно не уникально.Или, как уже упоминалось @user_unknown: время запуска не является практическим первичным ключом для исполнения.Для этого вы можете использовать столбцы serial .Вся установка может выглядеть примерно так:
-- show:
CREATE TEMP TABLE show (
show_id serial PRIMARY KEY
,title text
,basic_ticket_price money -- or numeric
);
INSERT INTO show (title, basic_ticket_price) VALUES
('Inception', 3.50)
,('Romeo & Juliet', 2.00);
-- performance:
CREATE TEMP TABLE performance (
performance_id serial PRIMARY KEY
,show_id int REFERENCES show(show_id) ON UPDATE CASCADE
,perf_start timestamp
);
INSERT INTO performance (show_id, perf_start) VALUES
(1, '2012-08-14 00:08')
,(2, '2012-08-12 00:12');
-- seat:
CREATE TEMP TABLE seat (
row_no text PRIMARY KEY
,area_name text
);
INSERT INTO seat (row_no, area_name) VALUES
('P01', 'rear stalls')
,('O05', 'front stalls')
,('A01', 'front stalls');
-- booking:
CREATE TEMP TABLE booking (
ticket_id serial PRIMARY KEY
,performance_id int REFERENCES performance(performance_id) ON UPDATE CASCADE
,row_no text REFERENCES seat(row_no) ON UPDATE CASCADE
,person_id int -- REFERENCES ?
);
INSERT INTO booking (performance_id, row_no, person_id) VALUES
(1, 'P01', 1)
,(2, 'O05', 4)
,(2, 'A01', 2);
Тогда ваш запрос может выглядеть так:
SELECT p.perf_start
,sh.title
,s.area_name
,count(*) booked
FROM booking b
JOIN seat s USING (row_no)
JOIN performance p USING (performance_id)
JOIN show sh USING (show_id)
GROUP BY 1,2,3
ORDER BY 1,2,3;
Результат:
perf_start | title | area_name | booked
---------------------+----------------+--------------+-------
2012-08-12 00:12:00 | Romeo & Juliet | front stalls | 2
2012-08-14 00:08:00 | Inception | rear stalls | 1