2009-04-19 7 views
0

J'espère que quelqu'un pourra m'aider avec un problème que j'ai avec la construction d'une requête dans Oracle.Problème Oracle statement statement

Je suis un débutant à oracle, allthough je n'ai quelque peu de connaissances sql -

Il est un scénario de système de réservation de cinéma - et Im essayant d'obtenir le sql ci-dessous pour la sortie d'une ligne, ce qui est un total des billets vendus pour une performance particulière dans un cinéma particulier. J'ai jusqu'à la liste ci-dessous, tout en énumérant les 12 occurrences, quand je veux 12 tickets vendus, etc.

Je l'ai construit initialement dans le générateur de requêtes, puis j'ai ajouté manuellement le compte et le groupe.

Toute pensée grandement appréciée quant à la façon dont je pourrais y parvenir, ou là où je peux aller mal.

Merci de votre visite.

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; 

sortie:

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

merci d'avoir édité le format :) beaucoup plus facile à comprendre maintenant! –

Répondre

0

Vous devez exclure "ticket.ticket_id" de clause de groupe (cette valeur unique faisant des groupes inutiles - chaînes de résultat):

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

et de la clause "select" aussi! – drnk

+0

salut - merci pour le commentaire, j'ai essayé quelque chose de similaire plus tôt - juste essayé à nouveau - le long de ce que vous avez dit et la même erreur est apparue - ORA-00979: pas une expression GROUP BY. cela ne montre pas quand tick.ticket_id est dans le groupe by - merci –

+0

vous devez exclure "ticket.ticket_id" de la clause "group by", et de la clause "select" aussi ("BILLET". "TICKET_ID" comme " ID DE BILLETS"). et ce sera bien. malheureusement, je ne peux pas éditer ma réponse (et j'ai écrit mauvais commentaire – drnk

1

Il n'a pas d' il est logique d'inclure à la fois ticket_id et COUNT(ticket_id) lorsque vous GROUP BY ticket_id.

je en déduire que votre schéma a des relations quelque chose comme ce qui suit:

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

Il semble que votre rapport désiré pourrait être décrit comme suit:

billets Count par film, la date de la performance & temps, et l'emplacement du cinéma.

Il est important dans toute requête en utilisant GROUP BY que les colonnes de votre SELECT -list correspondent aux colonnes dans votre liste GROUP BY (à l'exception des colonnes à l'intérieur des fonctions globales, telles que COUNT()). C'est ce qu'on appelle la règle à à valeur unique, et elle est appliquée en langage SQL standard. Ce sont les colonnes qui suivent "per" dans la description du rapport.

Voilà comment j'écrire la requête:

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; 

Notez que je syntaxe standard JOIN, déplacer les conditions de jointure dans ON clauses. La clause WHERE inclut uniquement les restrictions de requête. Logiquement, il n'y a pas de différence dans le résultat de la requête, mais dans un souci de clarté, je préfère conserver les conditions de jointure proches des tables respectives dans la clause FROM. J'ai aussi utilisé des alias de table à une seule lettre pour garder les choses plus lisibles (sauf r par rapport à run parce que les deux commencent par r).

+0

ça a l'air génial - j'ai jeté un coup d'oeil à ça, mais je continue à obtenir oro00936, expression manquante - j'ai étudié le script et tout me semble bien? –