![]() |
Pages (2): [1] 2 » Show 150 posts per page |
.dsy:it. (http://www.dsy.it/forum/)
- Basi di dati ~ informatica triennale (http://www.dsy.it/forum/forumdisplay.php?forumid=211)
-- [SQL] Help query (http://www.dsy.it/forum/showthread.php?threadid=28938)
Sql Sql Sql Sql
Apro questo thread in cui poter postare Query che non si riescono a risolvere con la speranza che ci sia qualcuno che ci aiuti!
Questo il mio dubbio:
MACCHINISTA(CF,Nome,Cognome,età)
TRENO(ID-treno,Tipo(ES/IC/IR/D),Lunghezza,Ristorante(S/N))
PERCORRENZA(CF,ID-treno,Nome-linea,Nr-fermate)
QUERY: determinare il CF dei macchinisti che percorrono il maggior numero di linee diverse
Come si fa? Probabilmente è semplice, ma non mi viene proprio!
Grazie
select a.cf from (
select cf, nomelinea, count(*) AS conteggio from percorrenza group by cf, nomelinea) a
where a.conteggio >= all (select count(*) from percorrenza group by cf, nomelinea);
con la query che uso come from creo una tabella che contiente il raggrupamente per codice fiscal e nome linea e un campo con in conteggio delle linee per codice fiscale, poi metto in where che il conteggio delle linee sia >= a tutte le righe della stessa query.
a me è venuta così
select cf, nome, cognome from macchinista natural inner join (
select cf from (select cf, count(*) AS conta from percorrenza group by cf) as macchinista where conta > 1 ) as percorrenza;
__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....
Così restituisci i macchinisti che percorrono più di una linea, non quelli che percorrono il maggior numero di linee...
Originally posted by zonker
Così restituisci i macchinisti che percorrono più di una linea, non quelli che percorrono il maggior numero di linee...
__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....
per il maggior numero di linee si intende che se alcuni macchinisti percorrono 1 linea, altri 2 altri 4 e altri 7 tu devi restituire i dati dei macchinisti che ne percorrono 7.
e così ?
SELECT cf, nome, cognome from macchinista natural inner join
(SELECT cf, COUNT(*) FROM percorrenza GROUP BY cf ORDER BY cf ASC LIMIT 1) as a;
__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....
Direi di no...
intanto è sbagliata la count(*) perchè se un macchinista percorre una sola linea con 10 treni diversi ti restituisce 10 anzichè 1, quindi sarà count(Nome-linea), inoltre se vuoi dovresti poi ordinare non per cf asc ma per count(nome-linea) desc per poi fare il limit 1. Ma anche questo è sbagliato in quanto se ci sono 5 macchinisti che percorrono il maggior numero di linee la query così corretta te ne restituisce solo uno dei 5 e poi non sono sicuro che LIMIT sia SQL standard.
immaginavo di essermi infilato in un caso particolare. Il risultato di primo acchito è giusto ma non sapevo se lo era sempre.
__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....
Scusa, non odiarmi, ma il risultato è sbagliato anche di primo acchitto se fai la ORDER BY cf...li metti in ordine per codice fiscale...
nessu odio
code:
SELECT cf, COUNT(*) FROM percorrenza GROUP BY cf HAVING COUNT(*) >= ALL ( SELECT COUNT(*) FROM percorrenza GROUP BY cf )
__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....
Così ci siamo come metodo, ora puoi sistemarla in modo che non tiri fuori quelli che hanno più righe sulla tabella percorrenza ma quelli che percorrono il maggior numero di linee diverse.
Così com'è se c'è un macchinista che con 10 treni diversi percorre una sola linea e un macchinista che percorre con un solo treno per linea 5 linee diverse questa query ti restituisce erroneamente il primo macchinasta (quello dei 10 treni) e non il secondo (quello delle 5 linee)
ma da come è fatta questa BD
MACCHINISTA(CF,Nome,Cognome,età)
TRENO(ID-treno,Tipo(ES/IC/IR/D),Lunghezza,Ristorante(S/N))
PERCORRENZA(CF,ID-treno,Nome-linea,Nr-fermate)
io mi sono immaginato che, trovati CF uguali in PERCORRENZA, si determinano di conseguenza linee differenti.
001, trenoA, Milano-Roma
001, trenoB, Milano,Como
001, trenoC, Milano-Venezia
002, trenoB, Milano,Como
003, trenoA, Milano-Roma
e così via
p.s.
ho perso qualche chiave per strada
__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....
prendi questo esempio per percorrenza:
CF1, Treno1, Milano-Roma
CF1, Treno2, Milano-Roma
CF1, Treno3, Milano-Roma
CF2, Treno4, Milano-Como
CF2, Treno5, Milano-Torino
il CF1 percorre una Linea con 3 righe nella tabella, il CF2 percorre 2 linee con 2 righe nella tabella.
Quindi contare le linee raggruppando per CF non restituisce il risultato richiesto (il maggior numero di linee)
allora molto dipende da come si pensano i dati che popolano la BD
__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....
| All times are GMT. The time now is 06:10. | Pages (2): [1] 2 » Show all 25 posts from this thread on one page |
Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.