PDA

View Full Version : SQL : settare a NULL


mitika
14-06-2011, 17:59
ciao raga..mi sto esercitando per l'esame di basi e..ho un problema con una query..

"mostrare per ogni impiegato,il suo cf,il cognome e il numero di familiari a carico maschi che ha,se ha familiari a carico, oppure il suo cf e il cognome affiancato da NULL se non ha familiari a carico"

sono riuscita a fare la query, ma come faccio per "affiancare il NULL" a chi non ha familiari?
la query che ho fatto è corretta ed è questa:


select i.cf, i.cognome, count(f.sesso)
from impiegato i left join familiare_a_carico f on i.cf=f.cf_impiegato
where f.sesso='M'
group by i.cf,i.cognome

Cor3
14-06-2011, 18:39
Puoi usare un CASE

select i.cf, i.cognome, CASE count(f.sesso) WHEN 0 THEN NULL ELSE count(f.sesso) END AS a_carico
from impiegato i left join familiare_a_carico f on i.cf=f.cf_impiegato
where f.sesso='M'
group by i.cf,i.cognome

In pratica se non ci sono parenti a carico ritorna
CF - COGNOME - NULL

(se ho capito bene quello che chiedevi) ;)

mitika
14-06-2011, 18:47
Cor3 hai capito ciò che intendevo.. :)
ma il risultato è lo stesso..solo i valori dei maschi a carico senza il resto..
secondo me,il problema è nel where..perchè lì impongo che f.sesso='M' e
quindi continua a contare solo i maschi..che suggerisci??

Cor3
14-06-2011, 18:55
Perchè non posti la strutture delle tabelle cosi è tutto più semplice? :D

khelidan1980
14-06-2011, 19:00
Cor3 hai capito ciò che intendevo.. :)
ma il risultato è lo stesso..solo i valori dei maschi a carico senza il resto..
secondo me,il problema è nel where..perchè lì impongo che f.sesso='M' e
quindi continua a contare solo i maschi..che suggerisci??

prova così:

select i.cf, i.cognome, count(f.sesso)
from impiegato i left join familiare_a_carico f on i.cf=f.cf_impiegato
AND f.sesso='M'
group by i.cf,i.cognome

mitika
14-06-2011, 19:01
GRAZIE khelidan1980..era molto più semplice di quanto io avessi pensato.. :)

khelidan1980
14-06-2011, 19:07
GRAZIE khelidan1980..era molto più semplice di quanto io avessi pensato.. :)

Ni..L'importante è che hai capito il perché, non è proprio immediato se non si mastica sql

mitika
14-06-2011, 19:20
no no..seriamente,ho capito..però ho anche un altro problema..
altra query..in realtà non riesco proprio a capire che condizione devo impostare..

"mostrare il cf, nome e cognome di tutti gli impiegati che non hanno alcuna collega donna che lavora nel loro stesso dipartimento"

ho iniziato a fare questa parte di query, ma la condizione delle colleghe donne,non ho proprio idea di come farla


select cf, nome,cognome
from impiegato i join dipartimento d on i.numero_dipartimento=d.numero_dipartimento


le 2 tabelle,sono collegate tra loro da quell'unica condizone presente nel join..
non voglio il codice..voglio capire..

khelidan1980
14-06-2011, 19:32
sei sulla strada giusta, così associ gli impiegati al proprio dipartimento, ora devi filtrare queste righe in base alla condizione che ti è stata data

ndakota
15-06-2011, 08:04
Potresti sottrarre a quelli impiegati, gli impiegati che hanno colleghe donne. Ti aiuterebbe questo?

mitika
15-06-2011, 08:51
Potresti sottrarre a quelli impiegati, gli impiegati che hanno colleghe donne. Ti aiuterebbe questo?

il problema è che non ho proprio idea di come impostare la condizione colleghe femmine..la sottrazione so farla ma..è il resto che mi blocca..HELP ME..:help:

zuper
15-06-2011, 10:08
mi associo alla richiesta di capire meglio come sono strutturate le tabelle :)

bisogna sapere come è indicata la collega femmina :)
ci sarà un campo M/F o qualcosa del genere

mitika
15-06-2011, 10:38
ecco le 2 tabelle


CREATE TABLE IMPIEGATO(
CF CHAR(16) PRIMARY KEY,
NOME VARCHAR2(20) NOT NULL,
COGNOME VARCHAR2(20) NOT NULL,
SESSO VARCHAR2(1),
CF_SUPERVISORE CHAR(16),
NUMERO_DIPARTIMENTO NUMBER(2,0) NOT NULL,
CONSTRAINT CHECK_SESSO CHECK(SESSO IN ('M','F'))
)



CREATE TABLE SEDE_DIPARTIMENTO(
NUMERO_DIPARTIMENTO NUMBER(2,0),
CITTA_SEDE VARCHAR2(20),
CONSTRAINT PK_SEDE PRIMARY KEY (NUMERO_DIPARTIMENTO,CITTA_SEDE))

zuper
15-06-2011, 10:52
non mi pare serva nessuna join tra le 2

quello che farei è

tirare fuori i distinct numeri di dipartimento where sesso = 'F'

e poi tirare fuori gli altri dati dove il numero del dipartimento NOT IN la query precedente

khelidan1980
16-06-2011, 19:37
in effetti non serve nemmeno la join, hai tutto nella prima tabella ti basta fare una subquery nella where ragionaci