Re: [postgresql-it] raggruppare per trimestre con join, risultato non corretto

  • From: Giuseppe Naponiello <beppenapo@xxxxxxxxx>
  • To: postgresql-it <postgresql-it@xxxxxxxxxxxxx>
  • Date: Mon, 30 Nov 2015 09:43:32 +0100

Ciao,


Per quanto riguarda il primo problema, basta una case, tenendo presente
che i valori NULL non vengono contati o sommati:


ottimo, non ci avevo pensato...grazie per la dritta ;)

Per il secondo problema, io risolverei il  filtro con una condizione di
exists


avevo già provato ma non funziona, se c'è una riga in "record" c'è di
sicuro anche in "aree".
La tabella record gestisce "aree presenti sul territorio" che possono
essere più o meno grandi, e possono trovarsi a cavallo di più Comuni, anche
di Regioni diverse; da qui il problema nel conteggio dei record: se filtro
per "regione" il risultato è corretto anche se il mio record è a cavallo
tra più regioni, ma se filtro per "compilatore" o se non applico filtri il
numero totale sballa (ad esempio se il record "id 20" è associato a 5 aree,
nel count viene contato 5 volte).
Riflettendoci non credo sia possibile ottenere il risultato che voglio: per
capirci, la tabella "record" gestisce siti archeologici, se il mio sito si
estende su 3 Comuni, anche della stessa regione, attraversando la tabella
"aree" per arrivare alla regione la query non considera più 1 record ma,
giustamente, 3

Spero di sbagliarmi ;)


Il giorno 29 novembre 2015 14:05, Daniele Frigo <daniele.frigo@xxxxxxxxx>
ha scritto:

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




-- 
*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

Other related posts: