2015-04-06 42 views
0

我正在嘗試編寫一個查詢來檢查有多少座位已被填充,以及在屏幕中有多少座位留在一排電影中,但幾小時後想我仍然無法讓我周圍的頭,我已經嘗試了許多疑問改變where子句中,即使子查詢,每次我得到一些錯誤:(查詢來計算預訂和留在屏幕上的座位數

查詢我使用這個如下:

select 
    10 as [total seats in a row], 
    perName as [movie name], 
    seatRow as [seat row], 
    (filledSeats - 10) as [seats left in a row] 
    count(s.seatNo) filledSeats 
FROM 
    seats as s inner join 
    tickets as t on s.seatNo = t.seatNo inner join 
    performances as p on t.perID = p.perID 
where 
    screenNo = '2' AND 
    perName = '50 shades of Grey' 
group by 
    perName 

但即使這一個給我錯誤

樣本d ATA如下:

CREATE TABLE seats (
seatNo int IDENTITY (1,1) not null, 
screenNo int, 
screen varchar (20), 
seatType Varchar (10), 
seatRow varchar (5), 
PRIMARY KEY (seatNo), 
FOREIGN KEY (screenNo) REFERENCES screens 
); 
insert into seats values ('1','3', 'Normal', 'A'); 
insert into seats values ('1','3', 'Normal', 'B'); 
insert into seats values ('1','3', 'VIP', 'D'); 
insert into seats values ('1','1', 'Normal', 'F'); 
insert into seats values ('1','3', 'VIP', 'E'); 
insert into seats values ('1','2', 'VIP', 'C'); 
insert into seats values ('1','1', 'VIP', 'C'); 
insert into seats values ('2','2', 'Normal', 'D'); 
insert into seats values ('2','1', 'VIP', 'F'); 
insert into seats values ('2','2', 'Normal', 'B'); 
insert into seats values ('2','1', 'Normal', 'B'); 
insert into seats values ('2','2', 'VIP', 'B'); 
insert into seats values ('2','2', 'Normal', 'A'); 
insert into seats values ('3','2', 'VIP', 'B'); 
insert into seats values ('2','1', 'Normal', 'C'); 
insert into seats values ('3','3', 'Normal', 'E'); 
insert into seats values ('3','2', 'VIP', 'C'); 
insert into seats values ('3','3', 'VIP', 'A'); 
insert into seats values ('3','1', 'VIP', 'E'); 
insert into seats values ('3','1', 'Normal', 'D'); 

CREATE TABLE performances( 
perID int IDENTITY (1,1)NOT NULL, 
perName varchar (50), 
perTime Time, 
perDate Date, 
perType varchar (20), 
duration varchar (10), 
screenNo int, 
rating varchar (10), 
location varchar (10), 
PRIMARY KEY (perID), 
); 
insert into performances values ('50 Shades of Grey', '12:00', '2015-03-08',  'Movie', '2hrs', '3', 'PG', 'Chelmsford'); 
insert into performances values ('50 Shades of Grey', '15:00', '2015-02-20', 'Movie', '2hrs', '2', '18', 'Chelmsford'); 
insert into performances values ('50 Shades of Grey', '18:00', '2015-02-26', 'Movie', '2hrs', '3', '18', 'Chelmsford'); 
insert into performances values ('50 Shades of Grey', '21:00', '2015-03-28', 'Movie', '2hrs', '2', 'PG', 'Chelmsford'); 
insert into performances values ('Paddington', '12:00', '2015-03-26', 'Movie', '2:30hrs', '2', '18', 'Chelmsford'); 
insert into performances values ('Paddington', '15:00', '2015-03-03', 'Movie', '2:30hrs', '3', 'PG', 'Chelmsford'); 
insert into performances values ('Paddington', '18:00', '2015-02-02', 'Movie', '2:3hrs', '3', 'PG', 'Chelmsford'); 
insert into performances values ('Paddington', '21:00', '2015-03-31', 'Movie', '2:30hrs', '1', '18', 'Chelmsford'); 
insert into performances values ('Shakespeare', '12:00', '2015-02-25', 'Movie', '3hrs', '2', '18', 'Chelmsford'); 
insert into performances values ('Shakespeare', '15:00', '2015-02-06', 'Movie', '3hrs', '3', 'PG', 'Chelmsford'); 
insert into performances values ('Shakespeare', '18:00', '2015-02-13', 'Movie', '3hrs', '3', '18', 'Chelmsford'); 
insert into performances values ('Shakespeare', '21:00', '2015-01-09', 'Movie', '3hrs', '3', 'PG', 'Chelmsford'); 
insert into performances values ('Jupiter Ascending', '12:00', '2015-01-11', 'Movie', '2:3hrs', '1', '18', 'Chelmsford'); 
insert into performances values ('Jupiter Ascending', '15:00', '2015-01-19', 'Movie', '2:30hrs', '2', '18', 'Chelmsford'); 
insert into performances values ('Jupiter Ascending', '18:00', '2015-02-06', 'Movie', '2:3hrs', '3', 'PG', 'Chelmsford'); 
insert into performances values ('Jupiter Ascending', '21:00', '2015-01-02', 'Movie', '2:3hrs', '2', 'PG', 'Chelmsford'); 
insert into performances values ('50 Shades of Grey', '12:00', '2015-01-06', 'Movie', '2hrs', '1', '18', 'Chelmsford'); 
insert into performances values ('50 Shades of Grey', '15:00', '2015-03-28', 'Movie', '2hrs', '3', 'PG', 'Chelmsford'); 
insert into performances values ('50 Shades of Grey', '18:00', '2015-02-09', 'Movie', '2hrs', '2', 'PG', 'Chelmsford'); 
insert into performances values ('50 Shades of Grey', '21:00', '2015-02-06', 'Movie', '2hrs', '2', '18', 'Chelmsford'); 


CREATE TABLE bookings( 
    bookingID int IDENTITY (1,1) NOT NULL, 
    customerID int , 
    clerkID varchar (20) , 
    perID int, 
    ticketBooked int, 
    bookingDate Date, 
    bookingTime time, 
    bookingType varchar(20), 
    totalCost decimal(5,2), 
    PRIMARY KEY (bookingID), 
    FOREIGN KEY (customerID) REFERENCES customers, 
    FOREIGN Key (clerkID) REFERENCES clerks, 
    ); 

insert into bookings values (16, 'clerk04', 1, 2, '2015-02-24', '12:00', 'Normal', '20'); 
insert into bookings values (2, 'clerk02', 20,3, '2015-02-25', '15:00', 'Advance', '34'); 
insert into bookings values (10, 'clerk04', 3,5, '2015-02-17', '18:00', 'Advance', '75'); 
insert into bookings values (5, 'clerk01', 19,2, '2015-01-24', '21:00', 'Advance', '30'); 
insert into bookings values (13, 'clerk01', 4,1, '2015-02-05', '12:00', 'Normal', '10'); 
insert into bookings values (20, 'clerk04', 5,1,'2015-01-26', '15:00', 'Normal', '12'); 
insert into bookings values (4, 'clerk03', 6, 3,'2015-02-09', '18:00', 'Advance', '30'); 
insert into bookings values (1, 'clerk03', 2, 1,'2015-01-03', '21:00', 'Advance', '15'); 
insert into bookings values (17, 'clerk04', 3, 1,'2015-02-09', '12:00', 'Normal', '12'); 
insert into bookings values (9, 'clerk02', 18,2,'2015-02-02', '15:00', 'Advance', '20'); 
insert into bookings values (11, 'clerk01', 6,3,'2015-02-10', '18:00', 'Advance', '45'); 
insert into bookings values (18, 'clerk01',1 ,1,'2015-02-06', '21:00', 'Normal', '12'); 
insert into bookings values (8, 'clerk05', 5,2,'2015-01-13', '12:00', 'Advance', '20'); 
insert into bookings values (6, 'clerk02', 7,2,'2015-02-05', '15:00', 'Advance', '20'); 
insert into bookings values (10, 'clerk03', 8,1,'2015-02-14', '18:00', 'Normal', '15'); 
insert into bookings values (14, 'clerk01', 9,2,'2015-01-19', '21:00', 'Normal', '20'); 
insert into bookings values (7, 'clerk05', 10, 3,'2015-01-29', '12:00', 'Advance','34'); 
insert into bookings values (3, 'clerk01', 12, 1,'2015-02-18', '15:00', 'Normal', '12'); 
insert into bookings values (13, 'clerk02', 15,3,'2015-01-08', '18:00', 'Normal', '45'); 
insert into bookings values (19, 'clerk03', 6, 2,'2015-01-27', '21:00', 'Normal', '30'); 

CREATE Table tickets (
ticketNo int IDENTITY (1,1) Not Null, 
bookingID int, 
perID int, 
seatNo int, 
ticketType varchar(10), 
ticketDate date, 
ticketPrice decimal (4,2), 
screen int, 
perTime time, 
PRIMARY KEY (ticketNo), 
FOREIGN KEY (bookingID) REFERENCES bookings, 
FOREIGN KEY (perID) REFERENCES performances, 
FOREIGN KEY (seatNo) REFERENCES seats, 
); 
insert into tickets values (20, 1, 1,'Student', '2015-01-12', '10 ', '1', '15:00'); 
insert into tickets values (19, 7, 2,'VIP', '2015-01-11', '15', '2', '21:00'); 
insert into tickets values (18, 1, 3,'Adult', '2015-02-21', '12', '2', '15:00'); 
insert into tickets values (17, 19, 4,'Adult', '2015-03-25', '12', '1', '18:00'); 
+1

您可以爲您的查詢引用的「票據」添加架構和示例數據嗎? – Bohemian 2015-04-06 10:28:09

+0

喜波希米亞 請檢查我的帖子我已更新 – xack 2015-04-06 11:40:37

回答

0

你還沒有爲tickets顯示任何模式(或數據),並且bookings雖然在查詢不使用已經顯示出它的架構和數據,所以我只能在你想要的猜測。

這就是說,這是您的查詢與(我相信)糾正語法問題:

select 
    10 as [total seats in a row], 
    perName as [movie name], 
    seatRow as [seat row], 
    count(s.seatNo) - 10 as [seats left in a row], 
    count(s.seatNo) filledSeats 
FROM seats as s 
join tickets as t on s.seatNo = t.seatNo 
join performances as p on t.perID = p.perID 
where screenNo = '2' 
AND perName = '50 shades of Grey' 
group by perName, seatRow 

關於您報告錯誤,你得到的是錯誤的,因爲一旦你給一個表的別名,該表被有效地重新命名爲該別名的查詢 - 所以你不能引用完整的表名。

更改performances.perNamep.perName

+0

如果你看到我的查詢正確沒有performance.perName!這是我得到的錯誤,我使用每個名稱或p.perName – xack 2015-04-06 10:18:07

+0

行。嘗試該查詢。 – Bohemian 2015-04-06 11:46:56

0

你可以嘗試這樣的事情

SELECT 
s.seatType, 
COUNT(*) as [total seats in a row], 
perName as [movie name], 
seatRow as [seat row], 
COUNT(*) - SUM(CASE WHEN t.perID IS NOT NULL THEN 1 ELSE 0 END) as [seats left in a row], 
SUM(CASE WHEN t.perID IS NOT NULL THEN 1 ELSE 0 END) filledSeats 
FROM performances as p 
    INNER JOIN seats as s 
ON s.screenNo = p.screenNo 
LEFT JOIN 
    (
     SELECT b.perid ,t.seatNo 
     FROM bookings b 
     INNER JOIN tickets as t 
     ON t.bookingid = b.bookingid 
    )T 
ON s.seatNo = t.seatNo 
    AND T.perid = p.perid 
WHERE p.perid = 1 
GROUP BY perName, s.seatType,seatRow 

你可以看一下這個SQL Fiddle

我改變了一些輸入數據作爲相關的ID是不正確的。該模式具有冗餘列。

  • seats表有一個screen表的引用,也是一個screen從FK screenNo分開列。
  • Tickets有一個FK表現以及預訂(這反過來具有性能FK)。這些列看起來冗餘以及(ticketDate, screen and pertime
  • Locationperformance表看起來是的screen屬性或應由screen被稱爲另一位置特定表。
+0

感謝ughai的回覆,但在聲明的情況下t.id是什麼,我沒有在我的表格欄中填寫 – xack 2015-04-06 10:26:42

+0

@xack它應該是表格票的主要欄。你也可以使用t.seatNo或t.perId。查看更新的代碼。 – ughai 2015-04-06 10:47:08

+0

嗨Ughai我剛剛測試了它給我的查詢以下錯誤消息4104,級別16,狀態1,行17 無法綁定多部分標識符「seats.seatType」。 消息4104,級別16,狀態1,行2 無法綁定多部分標識符「seats.seatType」。 – xack 2015-04-06 22:14:47

0

解決問題;一步一步:一個,遺漏

  1. (filledSeats - 10) as [seats left in a row]後。
  2. filledSeats在您的表格中不是有效的字段,那麼它來自哪裏?
    如果是下一場應該再次count(s.seatNo),因爲你不能使用別名,在當前的查詢
  3. screenNo不是有效的領域也是在您的查詢,因爲它需要的是確定它是從哪裏來的前綴如s.screenNop.screenNo
  4. 當你有一個seatRow之後的字段select沒有任何聚合函數時,你應該在group by之後調用它。

那麼下面的查詢就沒有錯誤了;所以

select 
    10 as [total seats in a row], 
    perName as [movie name], 
    seatRow as [seat row], 
    (count(s.seatNo) - 10) as [seats left in a row], 
    count(s.seatNo) as filledSeats 
FROM 
    seats as s inner join 
    tickets as t on s.seatNo = t.seatNo inner join 
    performances as p on t.perID = p.perID 
where 
    p.screenNo = '2' AND 
    perName = '50 shades of Grey' 
group by 
    perName, seatRow 

如果你使用它的結果是::但需要一些修改

total seats in a row | movie name   | seat row | seats left in a row | filledSeats 
---------------------+----------------------+----------+---------------------+------------ 
10     | 50 Shades of Grey | F  | -9     | 1 

如果你改變(count(s.seatNo) - 10)(10 - count(s.seatNo)),你將有9,而不是。