Ciao, sono alle primissime armi col linguaggio SQL e volevo il vostro parere su un determinato esercizio: (ditemi eventuali errori che riscontrereste eventualmente)
Dato lo schema relazionale in figura che esprime la gestione dei piani tariffari da parte di una compagnia telefonica:
CLIENTE (codicefiscale, nome, cognome, numTelefonico, pianoTariffario)
PIANOTARIFFARIO (pianoTariffario, costoScattoAllaRisposta, costoAlSecondo)
TELEFONATA (codicefiscale, data, ora, numeroDestinatario, durata)
BOLLETTA (codicefiscale, mese, anno, cifra)
-Selezionare i clienti per i quali il costo vivo delle telefonate (inteso senza scatto alla risposta) sia mediamente inferiore allo scatto alla risposta del piano tariffario da essi sottoscritto.
sugg: si utilizzi una vista (table function) per calcolare il costo vivo di ogni telefonata.
Questa sarebbe la soluzione (scritta da me, presumo sia corretta):
Cioè, procedo creando una table function con "le stesse tuple" di telefonata.codice:SELECT codicefiscale FROM (SELECT codicefiscale, data, ora, (costoAlSecondo*durata) AS costoChiamata FROM TELEFONATA AS T, PIANOTARIFFARIO AS P, CLIENTE AS C WHERE P.pianoTariffario = C.pianoTariffario AND C.codicefiscale = T.codicefiscale) AS COSTOVIVO AS CV GROUP BY codicefiscale HAVING AVG(costoChiamata) < (SELECT costoScattoAllaRisposta FROM PIANOTARIFFARIO AS P, CLIENTE AS C WHERE C.pianoTariffario = P.pianoTariffario AND C.codicefiscale = CV.codicefiscale)
Quello che volevo sapere è:
Invece di procedere come ho fatto (ovvero, mantenendo anche le informazioni che non mi servono circa la data e l'ora della chiamata nella table function COSTOVIVO per il solo scopo di identificare ogni tupla, poiché in TELEFONATA questi attributi fanno parte della chiave), è corretto creare una table function COSTOVIVOMEDIO(codicefiscale, costoMedioChiamata) ed esprimere le condizioni sulla media direttamente su di essa?
In pratica, la soluzione descritta dalla query seguente
è altrettanto valida quanto la precedente?codice:SELECT codicefiscale FROM (SELECT codicefiscale, AVG(costoAlSecondo*durata) AS costoMedioChiamata FROM TELEFONATA AS T, PIANOTARIFFARIO AS P, CLIENTE AS C WHERE P.pianoTariffario = C.pianoTariffario AND C.codicefiscale = T.codicefiscale GROUP BY codicefiscale) AS COSTOVIVOMEDIO AS CVM WHERE costoMedioChiamata < (SELECT costoScattoAllaRisposta FROM PIANOTARIFFARIO AS P, CLIENTE AS C WHERE C.pianoTariffario = P.pianoTariffario AND C.codicefiscale = CVM.codicefiscale)

)
Rispondi quotando