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


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

Approfitto ancora un pò della tua disponibilità.
Ti sembra giusta questa traduzione dello schema relazionale dato per la query in concettuale ?

Grazie

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


Posted by zonker on 22-02-2007 15:24:

Direi proprio di sì.


Posted by mostrielo on 23-02-2007 10:50:

-- -- determinare il cf dei macchinisti che percorrono il maggior numero di linee diverse
select mx.cf
from (select num_lin_div.cf, count(*) as linee_div
from (select cf, nome_linea, count(*)
from percorrenza as p1
where exists (select *
from percorrenza as p2
where p1.cf=p2.cf and p1.nome_linea<>p2.nome_linea
)
group by cf, nome_linea
) as num_lin_div
group by num_lin_div.cf
) as mx
where mx.linee_div >= ALL (select max(mx.linee_div)
from (select num_lin_div.cf, count(*) as linee_div
from (select cf, nome_linea, count(*)
from percorrenza as p1
where exists (select *
from percorrenza as p2
where p1.cf=p2.cf and p1.nome_linea<>p2.nome_linea
)
group by cf, nome_linea
) as num_lin_div
group by num_lin_div.cf
) as mx
)
;


Posted by zonker on 23-02-2007 12:25:

Scusa se mi riposto...ma
select a.cf from
(select cf, nome_linea, count(*) as conteggio from percorrenza group by cf, nome_linea) a
where a.conteggio >= all (select count(*) from percorrenza group by cf, nome_linea);
è troppo semplice per piacerti?


Posted by mostrielo on 23-02-2007 13:20:

I macchinisti devono percorrere il maggior numero di linee DIVERSE.


Posted by zonker on 23-02-2007 13:33:

Hai ragione.
Cambio:
select cf from
(
select cf, count(*) as conteggio from
(select distinct cf, nome_linea from percorrenza) a group by cf
) b
where conteggio >= ALL (
select count(*) as conteggio from
(select distinct cf, nome_linea from percorrenza) c group by cf
);
Che te ne pare?


Posted by mostrielo on 23-02-2007 14:06:

Ok, va bene!


Posted by mark on 25-02-2007 10:58:

CLIENTE (Nr.telefono, Nome, Indirizzo)
ORDINE (Nr.telefono, Codice-Pizza, Codice-Operatore, Data, Costo)
PIZZA (Codice-Pizza, Nome, Prezzo)

Si richiede di formulare in SQL quanto segue:
• determinare per ogni operatore e ogni pizza il costo totale degli ordini effettuati;


SELECT codicepizza, sum(costo) FROM ORDINE GROUP BY codicepizza;

e con questa query estraggo il costo totale per ogni tipo di pizza venduta ma, come diamine ci inserisco l'operatore ?
La query è anche sbagliata perchè nella somma non tiene conto di operatori differenti :cry:

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


Posted by mostrielo on 26-02-2007 13:16:

può essere cosi?

SELECT codice_operatore, ordine.codice_pizza, sum(costo) as spesa_totale
FROM ordine, pizza
WHERE ordine.codice_pizza=pizza.codice_pizza
group by codice_operatore, ordine.codice_pizza;


Posted by mark on 26-02-2007 16:43:

Originally posted by mostrielo
può essere cosi?

SELECT codice_operatore, ordine.codice_pizza, sum(costo) as spesa_totale
FROM ordine, pizza
WHERE ordine.codice_pizza=pizza.codice_pizza
group by codice_operatore, ordine.codice_pizza;



si, è perfetto grazie

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


All times are GMT. The time now is 04:56.
Show all 25 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.