Problemi in Sql
salve a tutti. ho un problema con un paio di query in sql e sarei molto riconoscente se qualcuno mi aiutasse.
1a query:
date le relazioni:
Cliente(CodiceC,NomeC,EtaC,CittaC)
Acquista(CodiceC,CodiceP,Data,Ora,PercentualeSconto)
Prodotto(CodiceP,NomeP,TipologiaP)
Venduto(CodiceP,CodiceN,Quantità,PrezzoUnitario)
Negozio(CodiceN,NomeN,TipologiaN,CittàN)
Selezionare i nomi dei clienti ordinati per numero decrescente di prodotti acquistati in un negozio di elettronica e,a parità di questo, per numero decrescente di giocattoli acquistati.
Su questa query il mio dubbio sta nel fatto che non so se si possa usare "order by" con un operatore aggregato come "count".
2a query:
date le relazioni:
Festival(Codice,Nome,Genere,Luogo,Data)
Invita(CodiceFestival,CodiceCantante)
Cantante(Codice,Nome,AnnoNascita,Nazionalita)
Scrive(CodiceCantante,CodiceCanzone)
Canzone(Codice,Nome,Genere,Durata)
Selezionare il Festival che ha invitato il cantante che ha scritto più canzoni Blues in assoluto e non ha mai invitato cantanti che hanno scritto canzoni Rock.
In questa query il mio problema nasce dal fatto che non si possano usare le "viste" (necessarie, almeno credo, visto che non è possibile fare il "max" di un "count").
vi prego di darmi una mano e grazie in anticipo.
1a query:
date le relazioni:
Cliente(CodiceC,NomeC,EtaC,CittaC)
Acquista(CodiceC,CodiceP,Data,Ora,PercentualeSconto)
Prodotto(CodiceP,NomeP,TipologiaP)
Venduto(CodiceP,CodiceN,Quantità,PrezzoUnitario)
Negozio(CodiceN,NomeN,TipologiaN,CittàN)
Selezionare i nomi dei clienti ordinati per numero decrescente di prodotti acquistati in un negozio di elettronica e,a parità di questo, per numero decrescente di giocattoli acquistati.
Su questa query il mio dubbio sta nel fatto che non so se si possa usare "order by" con un operatore aggregato come "count".
2a query:
date le relazioni:
Festival(Codice,Nome,Genere,Luogo,Data)
Invita(CodiceFestival,CodiceCantante)
Cantante(Codice,Nome,AnnoNascita,Nazionalita)
Scrive(CodiceCantante,CodiceCanzone)
Canzone(Codice,Nome,Genere,Durata)
Selezionare il Festival che ha invitato il cantante che ha scritto più canzoni Blues in assoluto e non ha mai invitato cantanti che hanno scritto canzoni Rock.
In questa query il mio problema nasce dal fatto che non si possano usare le "viste" (necessarie, almeno credo, visto che non è possibile fare il "max" di un "count").
vi prego di darmi una mano e grazie in anticipo.
Risposte
ciao,
per la 1° query ti rispondo dicendoti che la forma sintetica di un'interrogazione sql é:
select listaAttributi o Espressioni
from listaTabelle
[where CondizioniSemplici]
[group by ListaAttributiDiRaggruppamento]
[having condizioni aggregate]
[order by ListaAttributiDiOrdinamento].
quindi penso che si, la risposta alla tua prima domanda sia affermativa.
per la 2° query una mia possibile risposta sarebbe:
select Nome
from Festival join Invita on Codice=CodiceFestival
where CodiceCantante={select Codice
from Cantante join Scrive on Cantante.Codice=CodiceCantante join Canzone on
CodiceCanzone=Canzone.Codice
where Genere={select Genere
from Canzone
where Genere='Blues'
having max(CodiceCanzone) }
}
except
select Nome
from Festival join Invita on Codice=CodiceFestival
where CodiceCantante={select Codice
from Cantante join Scrive on Cantante.Codice=CodiceCantante join Canzone on
Canzone.Codice=CodiceCanzone
where Genere='Rock'}
Spero di averti aiutato.
per la 1° query ti rispondo dicendoti che la forma sintetica di un'interrogazione sql é:
select listaAttributi o Espressioni
from listaTabelle
[where CondizioniSemplici]
[group by ListaAttributiDiRaggruppamento]
[having condizioni aggregate]
[order by ListaAttributiDiOrdinamento].
quindi penso che si, la risposta alla tua prima domanda sia affermativa.

per la 2° query una mia possibile risposta sarebbe:
select Nome
from Festival join Invita on Codice=CodiceFestival
where CodiceCantante={select Codice
from Cantante join Scrive on Cantante.Codice=CodiceCantante join Canzone on
CodiceCanzone=Canzone.Codice
where Genere={select Genere
from Canzone
where Genere='Blues'
having max(CodiceCanzone) }
}
except
select Nome
from Festival join Invita on Codice=CodiceFestival
where CodiceCantante={select Codice
from Cantante join Scrive on Cantante.Codice=CodiceCantante join Canzone on
Canzone.Codice=CodiceCanzone
where Genere='Rock'}
Spero di averti aiutato.