Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以计算屏幕中预订和保留的座位数量_Sql_Sql Server_Sql Server 2008_Sql Server 2012 - Fatal编程技术网

Sql 查询以计算屏幕中预订和保留的座位数量

Sql 查询以计算屏幕中预订和保留的座位数量,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我试图写一个查询来检查屏幕上一部电影有多少座位已经坐满了,还有多少座位排在了一起,但经过几个小时的尝试后,我仍然无法理解,我尝试了很多查询,甚至改变了where子句的子查询,每次我都会遇到一些错误:( 我使用的查询如下所示: select 10 as [total seats in a row], perName as [movie name], seatRow as [seat row], (filledSeats - 10) as [seats left i

我试图写一个查询来检查屏幕上一部电影有多少座位已经坐满了,还有多少座位排在了一起,但经过几个小时的尝试后,我仍然无法理解,我尝试了很多查询,甚至改变了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
但即使是这个也给了我错误

样本数据如下:

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');

您尚未显示
票证的任何模式(或数据)
预订
虽然未在查询中使用,但已显示其模式和数据,因此我只能猜测您想要什么

也就是说,这是您的查询(我相信)语法问题得到纠正:

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

关于您报告的错误,您会得到该错误,因为一旦您给一个表一个别名,该表就会被有效地重命名,以便查询到该别名,因此您不能引用完整的表名


performance.perName
更改为
p.perName

您可以尝试类似的方法

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
你可以看看这个

我更改了一些输入数据,因为相关ID不正确。架构有冗余列

  • 您的
    seats
    表引用了
    screen
    表,并且在FK
    screenNo
    之外还有一个
    screen
  • Tickets
    既有FK to performance,也有booking(这反过来又有FK to performance)。这些列看起来也是多余的(
    ticketDate、screen和pertime
  • 性能
    表中的
    位置
    看起来是
    屏幕
    的一个属性,或者是另一个位置特定的表,应该由
    屏幕
    引用

    • 解决问题;逐步:

    • (filledSeats-10)作为[一排中的左侧座位]
      a
      之后,
      将丢失
    • filledSeats
      在您的表中不是有效字段,那么它来自哪里?
      如果它是下一个字段,它应该再次是
      count(s.seatNo)
      ,因为您不能在当前查询中使用别名
    • screenNo
      也不是查询中的有效字段,因为它需要一个前缀来确定它来自哪里,如
      s.screenNo
      p.screenNo
    • 如果在
      select
      之后有一个类似
      seatRow
      的字段,而没有任何聚合函数,那么也应该在
      groupby
      之后调用它
    • 因此,下面的查询不会有错误;但需要进行一些编辑:

      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
      而不是
      -9

      ,没有性能。perName!这就是我得到的错误,我使用了perName或p.perName。谢谢你的回复,但是when语句中的t.id是什么,我的表中没有columns@xack它应该是tabl的主要栏目e tickets。您也可以使用t.seatNo或t.perId。请参阅更新的代码。您好,我刚刚测试了查询,它给了我以下错误消息4104,级别16,状态1,第17行多部分标识符“seats.seatType”无法绑定。消息4104,级别16,状态1,第2行多部分标识符“seats.seatType”无法绑定。您能为您的查询所指的
      票据添加架构和示例数据吗?嗨,波希米亚人,请检查我更新的帖子