2012-03-25 4 views
2

:PostgreSQL을 다음 테이블을 감안할 때 select 문

shows: 

     title  | basic_ticket_price 
----------------+-------------------- 
    Inception  |    $3.50 
    Romeo & Juliet |    $2.00 

performance: 

    perf_date | perf_time |  title 
------------+-----------+---------------- 
    2012-08-14 | 00:08:00 | Inception 
    2012-08-12 | 00:12:00 | Romeo & Juliet 

booking: 
    ticket_no | perf_date | perf_time | row_no | person_id 
-----------+------------+-----------+--------+----------- 
      1 | 2012-08-14 | 00:08:00 | P01 | 1 
      2 | 2012-08-12 | 00:12:00 | O05 | 4 
      3 | 2012-08-12 | 00:12:00 | A01 | 2 

그리고 추가 테이블 : 지역 이름으로 예약 row_no의 같은 번호 좌석의 목록이 포함되어 좌석.

select count(row_no) AS row_no, 
     area_name 
from seat 
where exists (select row_no 
       from booking 
       where booking.row_no = seat.row_no) 
group by area_name; 

생산 :

row_no | area_name 
    --------+-------------- 
     1 | rear stalls 
     2 | front stalls 

을 지금 카운트 행을 사용하여 목록을 생성하는 하나의 SQL 문을 작성하는 AREA_NAME 어떻게

이 문을 사용하여 예약 된 좌석을 그룹화 데 쇼의 이름, 공연 날짜와 시간, 각 지역의 예약 좌석 수를 보여주는?

select s.title, 
     perf_date, 
     perf_time, 
     count(row_no) AS row_no, 
     area_name 
from shows s, 
     performance, 
     seat 
where exists (select row_no 
       from booking 
       where booking.row_no = seat.row_no) 
group by area_name,s.title,performance.perf_date,performance.perf_time; 

을하지만 행을 반복 보여줍니다 :

이 시도했습니다

 title  | perf_date | perf_time | row_no | area_name 
----------------+------------+-----------+--------+-------------- 
    Romeo & Juliet | 2012-08-12 | 00:12:00 |  1 | rear stalls 
    Romeo & Juliet | 2012-08-14 | 00:08:00 |  2 | front stalls 
    Inception  | 2012-08-12 | 00:12:00 |  1 | rear stalls 
    Inception  | 2012-08-14 | 00:08:00 |  2 | front stalls 
    Inception  | 2012-08-14 | 00:08:00 |  1 | rear stalls 
    Inception  | 2012-08-12 | 00:12:00 |  2 | front stalls 
    Romeo & Juliet | 2012-08-14 | 00:08:00 |  1 | rear stalls 
    Romeo & Juliet | 2012-08-12 | 00:12:00 |  2 | front stalls 
    (8 rows) 

이 해결에 어떤 도움을 주시면 감사하겠습니다.

+0

: 당신이이 두 번째에 조인 조건을 누락 전체 설정은 다음과 같을 수 있습니다 성명서. 쇼, 퍼포먼스, 그리고 좌석 사이에 단품 조인을 연출합니다. Youd'd는 'JOIN ...'을 사용하여 다시 작성했습니다. –

+0

제 사과를 수락하십시오. psql을 사용하고 있지만 mysql에 태그를 추가하여 espescially select 문과 비슷한 문장을 찾을 수 있습니다. –

+0

직렬 키를 기본 키로 사용해야합니다. 영화를 볼 수있는 두 번째 방을 얻으면 어떨까요?perf_date와 perf_time으로 식별되기 때문에 두 영화가 동시에 발생하도록 할 수 없습니다. 또는 공연이 예정되어있을 때 무엇을해야합니까? 여러 테이블을 수정해야하는데 이는 나쁜 일입니다. 그리고 사소한 제안 : 나는 열 제목에 표 제목을 반복하지 않을 것입니다. 그렇지 않으면 perf.perf_title - perf.title로 끝날 것입니다. –

답변

0

성능 항목별로 모든 예약을 찾으십시오. 그 예약 중, 좌석 테이블에 링크하여 지역 이름을 결정하십시오. 그런 다음 간단한 COUNT (*)를 쇼/영역 별 기준별로 그룹화합니다.

SELECT 
     p.perf_date, 
     p.perf_time, 
     p.title, 
     s.area_name, 
     COUNT(*) as SeatsSold 
    from 
     performance p 

     JOIN booking b 
      ON p.perf_date = b.perf_date 
      AND p.perf_time = b.perf_time 

      JOIN seat s 
       ON b.row_no = s.row_no 
    group by 
     p.perf_date, 
     p.perf_time, 
     p.title, 
     s.area_name 
0

행이 반복되지 않습니다. 검색 결과에 datearea_name의 차이점을 확인하십시오. 그것 모두는 나에게 잘 보인다.

2
당신은 하나의 timestamp 열에 열 perf_date dateperf_time time을 병합 고려해야한다

:

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