.dsy:it. 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)


Posted by MarcoAnselmo on 15-01-2007 08:25:

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


Posted by zonker on 15-01-2007 10:32:

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.


Posted by mark on 20-02-2007 12:13:

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.....


Posted by zonker on 20-02-2007 13:22:

Così restituisci i macchinisti che percorrono più di una linea, non quelli che percorrono il maggior numero di linee...


Posted by mark on 20-02-2007 14:54:

Originally posted by zonker
Così restituisci i macchinisti che percorrono più di una linea, non quelli che percorrono il maggior numero di linee...



allora non mi è chiaro cosa si intende per il maggior numero di linee. Pensavo si riferisse a quei macchinisti che percorrono appunto più linee.

__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....


Posted by zonker on 20-02-2007 15:00:

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.


Posted by mark on 21-02-2007 15:47:

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.....


Posted by zonker on 21-02-2007 15:55:

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.


Posted by mark on 21-02-2007 16:19:

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.....


Posted by zonker on 21-02-2007 16:30:

Scusa, non odiarmi, ma il risultato è sbagliato anche di primo acchitto se fai la ORDER BY cf...li metti in ordine per codice fiscale...


Posted by mark on 22-02-2007 09:50:

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.....


Posted by zonker on 22-02-2007 13:05:

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)


Posted by mark on 22-02-2007 13:16:

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.....


Posted by zonker on 22-02-2007 13:53:

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)


Posted by mark on 22-02-2007 14:17:

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.