0

希望有人可以帮助解决我在 oracle 中构建查询时遇到的问题。

我是oracle的新手,尽管我对sql知之甚少-

这是一个电影院预订系统场景 - 我试图让下面的 sql 输出一行,这是在特定电影院中为特定表演售出的门票总数。虽然它列出了所有 12 次出现,但我已经得到了如下信息,当我想说 12 票已售出等时。

我最初在查询生成器中构建了它,然后手动添加了计数和分组。

任何想法都非常感谢我如何实现这一目标,或者我可能会出错的地方。

感谢您的关注。

select count(ticket.ticket_id) as tickets_sold, "PERFORMANCE"."PERFORMANCE_DATE" as "PERFORMANCE_DATE",
     "FILM"."FILM_TITLE" as "FILM_TITLE",
     "TICKET"."TICKET_ID" as "TICKET_ID",
     "CINEMA"."LOCATION" as "LOCATION",
     "PERFORMANCE"."PERFORMANCE_TIME" as "PERFORMANCE_TIME" 
 from    "TICKET" "TICKET",
     "RESERVATION" "RESERVATION",
     "PERFORMANCE" "PERFORMANCE",
     "RUN" "RUN",
     "SCREEN" "SCREEN",
     "CINEMA" "CINEMA",
     "FILM" "FILM" 
 where   "PERFORMANCE"."PERFORMANCE_ID"="RESERVATION"."PERFORMANCE_ID"
 and     "PERFORMANCE"."RUN_ID"="RUN"."RUN_ID"
 and     "RUN"."FILM_ID"="FILM"."FILM_ID"
 and     "RUN"."SCREEN_ID"="SCREEN"."SCREEN_ID"
 and     "SCREEN"."CINEMA_ID"="CINEMA"."CINEMA_ID"
 and     "TICKET"."RESERVATION_ID"="RESERVATION"."RESERVATION_ID"
  and    "PERFORMANCE"."PERFORMANCE_DATE" ='1-mar-09' 
   and   "FILM"."FILM_TITLE" ='PIRATES OF THE CARIBBEAN - AT WORLDS END' 
   and   "CINEMA"."LOCATION" ='bradfordeast' 
   and   "PERFORMANCE"."PERFORMANCE_TIME" ='20:00' group by reservation.performance_id, performance.performance_date, film.film_title, ticket.ticket_id,cinema.location, performance.performance_time order by tickets_sold DESC;

输出:

TICKETS_SOLD PERFORMANCE_DATE FILM_TITLE TICKET_ID LOCATION PERFORMANCE_TIME 

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 485 bradfordeast 20:00

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 488 bradfordeast 20:00

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 484 bradfordeast 20:00 

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 491 bradfordeast 20:00

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 493 bradfordeast 20:00 

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 495 bradfordeast 20:00

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 489 bradfordeast 20:00

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 487 bradfordeast 20:00 

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 490 bradfordeast 20:00 

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 492 bradfordeast 20:00 

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 494 bradfordeast 20:00 

1 01-MAR-09 PIRATES OF THE CARIBBEAN - AT WORLDS END 486 bradfordeast 20:00 
4

2 回答 2

1

ticket_id同时包含和COUNT(ticket_id)when you是没有意义的GROUP BY ticket_id

我推断您的架构具有如下关系:

TICKETS --> RESERVATION --> PERFORMANCE --> RUN --> SCREEN --> CINEMA
                                   FILM --> RUN

看起来您想要的报告可以描述如下:

计算每部电影的门票、演出日期和时间以及电影院的位置。

在使用-list 中的列与列表中的列匹配的任何查询中,这一点很重要GROUP BY(聚合函数中的列除外,例如)。这称为单值规则,它在标准 SQL 中强制执行。这些将是报告描述中“per”之后的列。SELECTGROUP BYCOUNT()

这是我编写查询的方式:

SELECT COUNT(t."TICKET_ID") AS tickets_sold, 
 f."FILM_TITLE",
 c."LOCATION",
 p."PERFORMANCE_DATE",
 p."PERFORMANCE_TIME",
FROM "TICKET" t,
 JOIN "RESERVATION" r ON (r."RESERVATION_ID" = t."RESERVATION_ID") 
 JOIN "PERFORMANCE" p ON (p."PERFORMANCE_ID" = r."PERFORMANCE_ID")
 JOIN "RUN" run ON (run."RUN_ID" = p."RUN_ID")
 JOIN "SCREEN" s ON (s."SCREEN_ID" = run."SCREEN_ID")
 JOIN "CINEMA" c ON (c."CINEMA_ID" = s."CINEMA_ID")
 JOIN "FILM" f ON (f."FILM_ID" = run."FILM_ID")
WHERE p."PERFORMANCE_DATE" ='1-mar-09'
 AND f."FILM_TITLE" ='PIRATES OF THE CARIBBEAN - AT WORLDS END' 
 AND c."LOCATION" ='bradfordeast' 
 AND p."PERFORMANCE_TIME" ='20:00'
GROUP BY f."FILM_TITLE", c."LOCATION", p."PERFORMANCE_DATE", p."PERFORMANCE_TIME" 
ORDER BY tickets_sold DESC;

请注意,我使用了标准JOIN语法,将连接条件移动到ON子句中。该WHERE子句仅包括查询限制。从逻辑上讲,查询的结果没有区别,但为了清楚起见,我更喜欢让连接条件靠近FROM子句中的各个表。

我还使用单字母表别名来使内容更具可读性(除了r因为run它们都以 r 开头)。

于 2009-04-19T23:08:20.823 回答
0

您需要从组子句中排除“ticket.ticket_id”(这个唯一值使不必要的组 - 结果字符串):

select count(ticket.ticket_id) as tickets_sold, "PERFORMANCE"."PERFORMANCE_DATE" as "PERFORMANCE_DATE",
         "FILM"."FILM_TITLE" as "FILM_TITLE",
         "TICKET"."TICKET_ID" as "TICKET_ID",
         "CINEMA"."LOCATION" as "LOCATION",
         "PERFORMANCE"."PERFORMANCE_TIME" as "PERFORMANCE_TIME" 
     from    "TICKET" "TICKET",
         "RESERVATION" "RESERVATION",
         "PERFORMANCE" "PERFORMANCE",
         "RUN" "RUN",
         "SCREEN" "SCREEN",
         "CINEMA" "CINEMA",
         "FILM" "FILM" 
     where   "PERFORMANCE"."PERFORMANCE_ID"="RESERVATION"."PERFORMANCE_ID"
     and     "PERFORMANCE"."RUN_ID"="RUN"."RUN_ID"
     and     "RUN"."FILM_ID"="FILM"."FILM_ID"
     and     "RUN"."SCREEN_ID"="SCREEN"."SCREEN_ID"
     and     "SCREEN"."CINEMA_ID"="CINEMA"."CINEMA_ID"
     and     "TICKET"."RESERVATION_ID"="RESERVATION"."RESERVATION_ID"
      and    "PERFORMANCE"."PERFORMANCE_DATE" ='1-mar-09' 
       and   "FILM"."FILM_TITLE" ='PIRATES OF THE CARIBBEAN - AT WORLDS END' 
       and   "CINEMA"."LOCATION" ='bradfordeast' 
       and   "PERFORMANCE"."PERFORMANCE_TIME" ='20:00'
group by reservation.performance_id, performance.performance_date,
film.film_title, ticket.ticket_id,cinema.location, performance.performance_time
order by tickets_sold DESC;
于 2009-04-19T22:07:09.927 回答