Ciao,
Per quanto riguarda il primo problema, basta una case, tenendo presente
che i valori NULL non vengono contati o sommati:
exists
Per quanto riguarda il primo problema, basta una case, tenendo presente
che i valori NULL non vengono contati o sommati:
select extract(year from data) as anno,
sum(case when extract(quarter from data) = 1 then 1 else null end) as
primo_trimestre,
sum(case when extract(quarter from data) = 2 then 1 else null end) as
secondo_trimestre,
...
from record
group by extract(year from data), extract(quarter from data)
order by 1 desc, 2 asc
Per il secondo problema, io risolverei il filtro con una condizione di
exists tipo:
select ...
from record
where exists (
select 1
from area
where area.id_record = record.id_record
)
2015-11-28 15:09 GMT+01:00 Giuseppe Naponiello <beppenapo@xxxxxxxxx>:
Salve tutti,
non trovo la soluzione a questa query: voglio il numero di record
suddivisi per anno e, per ogni anno, per trimestre.
Devo, inoltre, creare un filtro per regione e/o compilatore.
Il risultato dovrebbe essere:
anno | I trimestre | II trimestre | III trimestre | IV trimestre
L'idea è quella di creare dei grafici (con qualche libreria javascript)
da pubblicare su un sito web
La struttura del db (postgresql 9.4) è:
regioni(id, regione)
province(id, provincia, regione)
comuni(id, comune, provincia)
localita(id, localita, comune)
area(id, comune, localita, record)
record(id, data, compilatore, ....)
Lo schema è abbastanza intuitivo :)
Lavorando solo sulla tabella record ottengo il risultato corretto:
select extract(year from data) as anno, extract(quarter from data) as
trimestri, count(*) from record group by extract(year from data),
extract(quarter from data) order by 1 desc, 2 asc;
anno | trimestri | count
------+-----------+-------
2015 | 1 | 1693
2015 | 2 | 485
2015 | 3 | 296
2015 | 4 | 41
2014 | 1 | 135
2014 | 2 | 920
2014 | 3 | 521
2014 | 4 | 1819
...
...
...
Primo problema: non riesco a creare delle colonne per trimestre, ho
provato con case, with, subquery ecc. ma niente, oltre questo non vado:
select extract(year from data) as anno, count(*) as primo from record
where extract(quarter from data) = 1 group by extract(year from data).
Ho pensato "vabbé, non mi riesce facciamo tutto in php"; mi sono
costruito il contenitore e per ogni trimestre una query...
Secondo problema: se aggiungo le altre tabelle per arrivare alla regione
i record aumentano, l'inghippo è nel passaggio dalla tabella area, il cui
rapporto con "record" è 1:n (1 record - n aree), ad esempio il primo
trimestre del 2015 ha 4110 record invece che 1693 (cioè il totale dei
record nella tabella area!), la query è:
select extract(year from record.data) as anno, count(record.id_record) as
tot
from record
left join area on area.id_record = record.id_record
left join comuni on area.id_comune = comuni.gid
left join province on comuni.id_provincia = province.id_provincia
left join regioni on province.id_regione = regioni.id_regione
group by extract(year from data)
order by 1 desc;
Sicuramente qualcuno di voi ha avuto a che fare con qualcosa de
genere...statistiche del genere credo sia abbastanza comuni.
Grazie per l'aiuto
Attendo con ansia ;)
-beppe-
--
*Giuseppe Naponiello*
*A**rc-**T**eam srl*
piazza Navarrino, 13 - 38023Cles (TN)
C.F. e P. IVA IT-01941600221
cell. +393476846599
mail: beppenapo@xxxxxxxxxxxx
pec: arc-team@xxxxxx
101 | www.arc-team.com
110 | http://arc-team-open-research.blogspot.it/
000 | https://independent.academia.edu/GiuseppeNaponiello
_______________________________________________
Postgresql-it mailing list
Postgresql-it@xxxxxxxxxxxxx
http://lists.psql.it/mailman/listinfo/postgresql-it
_______________________________________________
Postgresql-it mailing list
Postgresql-it@xxxxxxxxxxxxx
http://lists.psql.it/mailman/listinfo/postgresql-it