2009-05-04 7 views
0

Je me demande si quelqu'un peut faire la lumière sur une requête SQL avec laquelle je travaille;Requête retournant les mêmes sommes - oracle sql

J'ai construit cette requête;

SELECT SUM(TICKET_TYPE.PRICE) AS TOTALCINEMASALES, CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
FROM RESERVATION, TICKET, TICKET_TYPE, CINEMA, PERFORMANCE 
WHERE TICKET_TYPE.TICKET_TYPE_ID = TICKET.TICKET_TYPE_ID 
     AND TICKET.RESERVATION_ID = RESERVATION.RESERVATION_ID 
     AND RESERVATION.PERFORMANCE_ID = PERFORMANCE.PERFORMANCE_ID 
     AND CINEMA.LOCATION = 'SKIPTON' 
     AND PERFORMANCE.PERFORMANCE_DATE BETWEEN to_date('01/03/2009','DD/MM/yyyy') AND to_date('07/04/2009','DD/MM/yyyy') 
GROUP BY 
     CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
ORDER BY 
     TOTALCINEMASALES; 

Chaque fois que je le lance, il retourne l'ensemble sam des sommes sur chaque ligne pour totalcinemasales, mais je sais qu'il ya différents niveaux de ventes de billets, etc. se sont assis dans la base de données, il le fait pour chaque loaction que je change , des indications sur la façon dont je pourrais l'améliorer?

Merci

Répondre

2

Vous avez oublié de joindre CINEMA, sans doute avec la performance.

Devinez:

AND CINEMA.CINEMA_ID = PERFORMANCE.CINEMA_ID 

Vous pouvez utiliser la jointures ANSI, lorsque vous y habituer, il est plus facile à lire:

SELECT SUM(TICKET_TYPE.PRICE) AS TOTALCINEMASALES, CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
FROM  
    TICKET 
    inner join TICKET_TYPE 
    on TICKET_TYPE.TICKET_TYPE_ID = TICKET.TICKET_TYPE_ID 
    inner join RESERVATION 
    on TICKET.RESERVATION_ID = RESERVATION.RESERVATION_ID 
    inner join PERFORMANCE 
    on RESERVATION.PERFORMANCE_ID = PERFORMANCE.PERFORMANCE_ID 
    inner join CINEMA /* the missing link */ 
    on CINEMA.CINEMA_ID = PERFORMANCE.CINEMA_ID 
WHERE 
    CINEMA.LOCATION = 'SKIPTON' 
    AND PERFORMANCE.PERFORMANCE_DATE BETWEEN to_date('01/03/2009','DD/MM/yyyy') AND to_date('07/04/2009','DD/MM/yyyy') 
GROUP BY 
     CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
ORDER BY 
     TOTALCINEMASALES; 
+0

Merci, ce que vous ne pouvez pas voir (probablement la raison du problème après avoir lu votre suggestion) est qu'il n'y a pas de lien direct de la performance au cinéma, j'ai utilisé cinema> screen (cinema_id)> run (screen_id >> performance (run_id) - Devrais-je inclure ces deux tables et en ajoutant «et» pour le lin ks? ou ansi se joint, même si je sens que j'ai besoin d'entendre ce que j'en ai entendu dire un peu plus. –

+0

Oui, vous devez joindre toutes les tables. Si vous ne le faites pas, vous obtenez un produit cartésien, ce qui signifie que toutes les combinaisons de Cinema et les autres tables jointes sont renvoyées. Pour voir ce que je veux dire, supprimez la clause group by et la SUM de la clause select. Avec le filtre, vous supprimez toutes les combinaisons inutiles. –

+0

merci Stefan, va essayer –

0
SELECT SUM(TICKET_TYPE.PRICE) AS TOTALCINEMASALES, CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
FROM RESERVATION, TICKET, TICKET_TYPE, CINEMA, PERFORMANCE 
WHERE TICKET_TYPE.TICKET_TYPE_ID = TICKET.TICKET_TYPE_ID 
     AND TICKET.RESERVATION_ID = RESERVATION.RESERVATION_ID 
     AND RESERVATION.PERFORMANCE_ID = PERFORMANCE.PERFORMANCE_ID 
     AND CINEMA.LOCATION = 'SKIPTON' 
-- Added this 
     AND PERFORMANCE.CINEMA_ID = CINEMA.CINEMA_ID 
-- 
     AND PERFORMANCE.PERFORMANCE_DATE BETWEEN to_date('01/03/2009','DD/MM/yyyy') AND to_date('07/04/2009','DD/MM/yyyy') 
GROUP BY 
     CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
ORDER BY 
     TOTALCINEMASALES; 
Questions connexes