Newsgroup: it.comp.software.database
Titolo: Una semplice query

Vorrei chiedere se c'è qualcuno di buona voltà che mi aiuti a
formulare questa query in sql-92.
Lo schema relazionale è questo
Gli attribbuti in MAIUSCOLO sono le chiavi primarie
Assegnamento(CLIENTE,MATRICOLA,data,attività,NumeroOre)
IMIPIEGATO(MATRICOLA,cognome,nome)
Determinare per ogni attività l'impiegato(MATRICOLA,Cognome,nome) che
vi ha lavorato per il minimo numero di ore in totale.

ari...@tiscali.it
 ha scritto:

Ciao,
non è affato una semplie Query!
Qualche chiarimento, la chiave primaria di Assegnamento non mi torna...
Un impiegato lavora al più una volta per un certo cliente???
marc.

La chiave di assegnamento è formata dagli attributi
{CLIENTE,IMPIEGATO} , ad indicare il fatto che un impiegato puo essere
assegnato a piu clienti e per ogni uno di essi puo svolgere delle
attività.Ogni attività può eseguirsi anche in piu tempi(come puoi
vedere in assegnameto c'è il campo data),ma per gli scopi
dell'interrogazione puoi far finta anche che l'attributo CLIENTE non
esista.

 esista.
Quindi il monte ore minimo che ci interessa è indipendente dai clienti 
per i quali si sia svolta quell'attività? Perchè ovviamente la stessa 
attività può essere svolte per più clienti da più impiegati. Giusto?
marc.

 marc.
Si a noi ci interessa,indistintamete dal cliente,delle attivita
particolari, ovvero quelle che sono state svolte da un impiegato per un
numero di ore TOTALI che sono minori  rispetto a tutte le ore totali
per le  altre stesse attività per gli altri impiegati.
Ora ti scirivo un istanza della relazione assegnameto che vale piu di
tante parole:
Assegnameto(CLIENTE,MATRICOLA,data,attività,NumeroOre)
t0(tizio,aa,12/01/05,esami,3)
t1(tizio,aa,12/03/05,esami,2)
t2(zino,aa,12/03/05,esami,2)
t3(tizio,aa,24/05/05,tutorato,24)
t4(caio,dd,20/01/05,esami,10)
t5(sembronio,dd,21/01/05,esami,2)
t6(caio,dd,25/01/05,tutorato,5)
t7(caio,dd,26/01/05,tutorato,1)
Quindi siamo interessati a segnalare:
Che L'attivita esami è stata svolta dall'impiegato di matricola aa per
un minimo di ore totali(in questo caso 7) rispetto alle ore totali
delle  altre attivita esami fatte da altri(infatti dd ha fatto 12 ore
totali di esami,che sono maggiori di 7)e come puoi vedere di dd e aa
non ci interessa verificare per chi le ha fatte,basta che le ha fatte.
Per lo stesso motivo dobbiamo segnalare che l'attivita di tutorato e
stata svolta dall'impiegato di matricola dd per un minimo di ore totali
rispetto alle ore totali per la setessa attivita fatte la altri(aa ne
ha fatto 24 che sono maggiori di 6 ).
Ovviemete la query ci chiede di sengnalare oltre la matricola di
suddetti impiegati sfaticati, anche il nome congnome,e la specifica
attivita in questione.
Sepero di essere stato chiato e di aver chiarito ogni tuo dubbio,sto
abbozzando una soluzione sembra funzionare, magari se funziona dopo la
posto.

Ho abbozzato questa soluzioni. Secondo te funziona?
SELECT A.attivita,I.matricola,I.cognome
FROM impiegato I INNER JOIN assegnamento A on I.matricola=A.matricola
GROUP BY A.attivita,I.matricola,I.cognome
HAVING SUM(A.numeroOre) =
(SELECT MIN(T.#sommaDiOrePerAtt)
  FROM (SELECT attivita,matricola,SUM( numeroOre) AS #sommaDiOrePerAtt
               FROM assegnamento
               GROUP BY attivita,matricola) AS T
  WHERE A.attivita = T.attivita
  GROUP BY T.attivita);

ari...@tiscali.it
 ha scritto:

Ciao,
sembra una buona soluzione. Te ne propongo una seconda che non mi sembra 
ne migliore ne peggiore [se puoi creare viste si semplifica un po']:
select v1.*,I.Nome,I.Cognome from
(select SUM(NumeroOre) No,Attivita,Matricola
from Assegnamento
group by Attivita,Matricola)v1
inner join Impiegato I
on I.Matricola=v1.Matricola
left outer join
(select SUM(NumeroOre) No,Attivita,Matricola
from Assegnamento
group by Attivita,Matricola)v2
on v1.Attivita=v2.Attivita
and v1.No>v2.No
where v2.Matricola is null;
marc.

Volevo ringraziarti Marcello, trovo la tua soluzione molto elegante.
Ma tu sei un professionista o sei uno studente come me?

 Ma tu sei un professionista o sei uno studente come me?
Ciao,
stavo per scrivere "uno studente" ma non è, ahimé, vero...
Un "libero" professionista purtroppo...
marc. :-D