PDA

Visualizza la versione completa : [PL\SQL] QUERY su stessa tabella e group by


Alessio86
06-03-2009, 12:52
Salve a tutti vi espongo il mio roblema dovrei creare una query che mi mostri alcuni attributi sempre sulla stessa tabella e usndo la funzione count.
Per maggiore chiarezza ho inserito oltre alla query fatta da me ma che pero non esegue quello che vorrei il popolamento della tabella in questione


ecco cosa fa :



COUNT(CC_F) C_MATRICOLA CC_F
----------- -------------------- -----------
1 3004 A000000005
1 3005 A000000006
1 3007 A000000008
1 3002 A000000003
1 3012 A000000013
1 3014 A000000015
1 3016 A000000014
1 3000 A000000001
1 3013 A000000014
1 3008 A000000009
1 3010 A000000011

COUNT(CC_F) C_MATRICOLA CC_F
----------- -------------------- -----------
1 3006 A000000007
1 3015 A000000015
1 3003 A000000004
1 3009 A000000010
1 3011 A000000012
1 3001 A000000002
1 3017 A000000013



invece ecco cosa vorrei che uscisse



COUNT(CC_F) CC_F c_matricola
----------- ----------
1 A000000001 3000
1 A000000011 3010
1 A000000004 3003
1 A000000008 3007
2 A000000015 3014 -- il Cc_F in questione e presente 2 volte con 2 matricole diverse
2 A000000015 3015 -- il Cc_F in questione e presente 2 volte con 2 matricole diverse
1 A000000006
1 A000000007
1 A000000005
2 A000000014 3016 -- il Cc_F in questione e presente 2 volte con 2 matricole diverse
2 A000000014 3013 -- il Cc_F in questione e presente 2 volte con 2 matricole diverse
1 A000000009
1 A000000010

COUNT(CC_F) CC_F
----------- ----------
1 A000000002
1 A000000003
1 A000000012
2 A000000013




IN PRATICA MI DEVE ELENCARE QUANTE VOLTE IL CC_F E PRESENTE, IL CC_F IN QUESTIONE E LE MATRICLE ASSEGATE , RICORDO CHE QUESTI DATI SI TROVANO SULLA STESSA TABELLA (CLIENTE)




SELECT COUNT(CC_F)c_matricola,CC_F FROM CLIENTE GROUP BY CC_F,c_matricola;







--CLIENTE
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3000','OPERAIO',21,'A000000001','116');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3001','OPERAIO',31,'A000000002','117');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3002','DIPENDENTE',33,'A000000003','118');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3003','DIPENDENTE',43,'A000000004','119');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3004','DIPENDENTE',33,'A000000005','120');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3005','L PROFESSIONISTA',53,'A000000006','121');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3006','L PROFESSIONISTA',23,'A000000007','122');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3007','PENSIONATO',73,'A000000008','123');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3008','PENSIONATO',83,'A000000009','124');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3009','COMMERCIANTE',31,'A000000010','125');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3010','COMMERCIANTE',31,'A000000011','126');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3011','COMMERCIANTE',31,'A000000012','127');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3012','DISOCCUPATO',31,'A000000013','128');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3013','DISOCCUPATO',31,'A000000014','129');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3014','IMPIEGATO',51,'A000000015','130');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3015','IMPIEGATO',51,'A000000015','130');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3016','DISOCCUPATO',31,'A000000014','129');
INSERT INTO CLIENTE(C_MATRICOLA,LAVORO,ETA,CC_F,ID_RICH) VALUES
('3017','DISOCCUPATO',31,'A000000013','128');

LeleFT
06-03-2009, 13:08
Come espressamente indicato nel regolamento, sono da evitarsi epiteti come "Urgente" nelle discussioni perchè in un forum non hanno alcun senso: tutte le discussioni anno la medesima urgenza.


Ciao. :ciauz:

Alessio86
06-03-2009, 13:13
CHIEDO VENIA =) HO EDITATO IL TITOLO =)

MacApp
06-03-2009, 15:48
non ho provato, ma piu' o meno dovrebbe essere cosi':



select b.count_cc_f, b.CC_F, a.C_MATRICOLA
from CLIENTE as a
left join (select count(CC_F) count_cc_f, CC_F from CLIENTE group by CC_F) as b
on a.CC_F = b.CC_F


insomma fai una left join tra la tabella CLIENTE e la group by CC_F della stessa

Alessio86
06-03-2009, 15:59
il problema e che mi da errore ala definizione AS dandomi l'errore comando SQl terminato erroneamente ...

ma sicuro che posso usare As in una query ???





select b.count_cc_f, b.CC_F, a.C_MATRICOLA
from CLIENTE as a
left join (select count(CC_F) count_cc_f, CC_F from CLIENTE group by CC_F) as b
on a.CC_F = b.CC_F



ERRORE alla riga 1:
ORA-00933: comando SQL terminato erroneamente

in pratica se uso questa sintassi


(select count(CC_F) count_cc_f, CC_F from CLIENTE group by CC_F) as b;

o

select count(CC_F) count_cc_f, CC_F from CLIENTE group by CC_F as b;


mi da errore a via dell As b

YuYevon
06-03-2009, 16:10
Non usare AS, accosta la ridenominazione della tabella alla tabella stessa



from CLIENTE a

Alessio86
06-03-2009, 16:32
the grazie 1000 =)

mi siete stati di grandissimo aiutooooooooooooo =)

ho perso 2gg su questa query (anche xche no sapevo che si potessero rinominari)
un grandissimo grazzie ancora =)

Loading