2009-04-19 4 views
0

Надеюсь, что кто-то может помочь с проблемой, с которой я сталкиваюсь, создавая запрос в oracle.Проблема с подсчетом счетчика Oracle

Я новичок в оракул, Allthough у меня есть некоторые мало знаний SQL -

Это сценарий системы бронирования кино - и Im пытается получить 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 
+0

спасибо за редактирование формата :) гораздо проще понять сейчас! – 2009-04-19 22:09:43

ответ

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; 
+0

и из предложения «выбрать»! – drnk

+0

привет - спасибо за комментарий, я попробовал что-то подобное раньше - просто попробовал еще раз - по строкам того, что вы сказали, и та же ошибка появилась - ORA-00979: не выражение GROUP BY. это не показывает, когда tick.ticket_id является n группой по - спасибо – 2009-04-19 22:18:29

+0

, вам нужно исключить «ticket.ticket_id» из предложения «group by» и из предложения «select» («БИЛЕТ»). «TICKET_ID» как « TICKET_ID "). и это будет хорошо. к сожалению, я не могу отредактировать свой ответ (и я написал плохой комментарий – drnk

1

Оно не иметь смысл включать как ticket_id, так и COUNT(ticket_id), когда вы GROUP BY ticket_id.

я делаю вывод, что ваша схема имеет отношения что-то вроде следующего:

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

Это выглядит как ваш нужный отчет может быть описана следующим образом:

билетов графа в фильме, дата исполнения & время и место в кинотеатре.

Это важно в любом запросе, используя GROUP BY что столбцы в SELECT -list совпадают столбцы в вашем GROUP BY списке (для столбцов внутри агрегатных функций, таких как COUNT() исключением). Это называется Однозначное правило, и оно применяется в стандартном SQL. Это будут столбцы, следующие за «per» в описании отчета.

Вот как я бы написать запрос:

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).

+0

, который выглядит великолепно - я посмотрел на это, однако я продолжаю получать oro00936, отсутствует выражение - я изучил скрипт, и все это выглядит хорошо для меня? – 2009-04-20 19:52:06

 Смежные вопросы

  • Нет связанных вопросов^_^