![]() |
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.....
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.....
Direi proprio di sì.
-- -- 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
)
;
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?
I macchinisti devono percorrere il maggior numero di linee DIVERSE.
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?
Ok, va bene!
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 ![]()
__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....
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;
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;
__________________
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.