PDA

View Full Version : [pg sql] una domanda su una query e una su un trigger


IAmZak
14-06-2008, 15:56
ciao!

1)come si fa a fare delle percentuali?
per esempio ho una tabella con un 30 persone, con una colonna chiamata lavoro, e devo dire per ogni tipo di lavoro, la percentuale della gente che lo fà.
se 5/10 fanno "operaio", allora la query mi deve dare come risultato 50%.
ma il problema è che il /10 può aumentare o diminuire.

2)esiste da qualche parte una guida niubba che spieghi i trigger, fatti come funzioni e trigger. tipo:

CREATE OR REPLACE FUNCTION abc_FX() RETURNS trigger AS $abc_FX$
BEGIN
.........
END;
$abc_FX$ LANGUAGE plpgsql;

CREATE TRIGGER abc
AFTER INSERT OR UPDATE ON tabella
FOR EACH ROW EXECUTE PROCEDURE abc_FX()

grazie!!!

amedeoviscido
14-06-2008, 18:40
Per quanto riguarda la prima domanda, ho elaborato questa query.
Si presuppone che la tabella sia:

-----------
| Mansioni |
-----------
Nominativo
mansione

SELECT A.mansione as "Mansione", count(A.mansione) * 100.0 / totale as "percentuale" FROM mansioni A, (SELECT count(*) as "totale" FROM mansioni) as B GROUP BY A.mansione,B.totale

Ho provato ad inserire questi tre record:

Franco Rossi, Ing
Giuseppe Bianchi, Imp
Antonio Verdi, Imp

Con risultati

Ing | 33.333333
Imp | 66.666666

IAmZak
14-06-2008, 19:11
complimenti, e grazie

IAmZak
14-06-2008, 20:21
perfetto, ha funzionato.
ora sto provando a rendere la cosa più precisa.
dunque ammettiamo che ho una tabella così:

CREATE TABLE persone
(
cod_fiscale character varying(20) NOT NULL,
nome character varying(20) NOT NULL,
cognome character varying(30) NOT NULL,
data_n date NOT NULL,
tipo character(15),
CONSTRAINT persone_pkey PRIMARY KEY (cod_fiscale)
)

dove in tipo metto lavoratore, studente, niente.

se io dovessi restituire le percentuali di persone (lavoratore+studenti, non separati) suddivisi in fasce di età (21-25, 26-30, ecc.), ma solo se sono lavoratori o studenti (quindi come totale devo guardare anche i niente)?

cioè ho 3 lavoratori, 3 studenti, 3 niente.
sarebbe 66,6%. però devo anche dividere questo 66,6 in rapporto alle fasce di età









ah! quella di prima l'ho risolta così: now() - interval '31 years' < data_n AND now() - interval '26 years' e funziona!

amedeoviscido
15-06-2008, 10:43
complimenti, e grazie

Figurati


cod_fiscale character varying(20) NOT NULL,


Se posso suggerirti una cosa, il codice fiscale non è character varying, poiché è sempre di 16 caratteri.


se io dovessi restituire le percentuali di persone (lavoratore+studenti, non separati) suddivisi in fasce di età (21-25, 26-30, ecc.), ma solo se sono lavoratori o studenti (quindi come totale devo guardare anche i niente)?


Bella domanda.
Per restituire la percentuale di lavoratori+studenti, basta modificare la prima query che ti ho dato in questo modo:

SELECT A.non_niente * 100.0 / B.totale FROM (SELECT count(*) as "non_niente" FROM persone WHERE tipo<>'niente') as A, (SELECT count(*) as "totale" FROM persone) as B

Suddividere però per fasce d'età, difficilino... ho trovato una soluzione ma richiede una query per ogni fascia di età:

SELECT A.non_niente * 100.0 / B.totale FROM (SELECT count(*) as "non_niente" FROM persone WHERE tipo<>'niente' AND now() - interval '25 years' < data_n AND now() - interval '21 years' > data_n) as A, (SELECT count(*) as "totale" FROM persone) as B

Ovviamente per ogni query devi modificare la fascia d'età.