Entra

View Full Version : [SQL][Query Access] Query a campi incrociati (crosstab query) con celle blank


Micene.1
15-06-2009, 17:37
salve ho un problema con una query crosstab (ho access inglese, penso che in italiano sia la query a campi incrociati)

allora ho settato la riga, colonna e il valore (ho un database dove voglio sapere il numero di pratiche (valore) per ogni mese (colonna) e per ogni prestazione (riga)


praticamente la matrice è cosi:


------------ Mese1 Mese2 Mese... MeseK
prestazione1 N Pratiche N Pratiche
prestazione2
prestazione...
prestazioneN


il problema è che mi esce una matrice che omette le colonne o righe vuote (ovvero è possibile che alcune righe o colonne non vengano inserite, se, ad esempio, per quel mese o per quella prestazione nn ci sono pratiche)...invece io vorrei che vangano inserite tutte le colonne e righe in modo da avere delle matrici di dimensioni costanti

spero di essermi speigato...è molto piu difficile spieare la query che farla...

john_revelator
15-06-2009, 20:20
Se ho capito bene la tua query dovrebbe essere:


SELECT prestazione,
sum(iif(month(data)=1,1,0)) AS gennaio,
sum(iif(month(data)=2,1,0)) AS febbraio,
sum(iif(month(data)=3,1,0)) AS marzo,
..........
FROM tabella
GROUP BY prestazione;

Micene.1
16-06-2009, 09:25
le crosstab nn le so costruire in sql ma solo col costruttore di access (si usa il comando PIVOT)...cmq allego il codice

TRANSFORM Count(AA.Id_Pratica_Ps) AS CountOfId_Pratica_Ps
SELECT AA.Tipo_Lavoro
FROM AA
GROUP BY AA.Tipo_Lavoro
ORDER BY AA.Tipo_Lavoro
PIVOT Format([Time],"yy mm");

access con le crosstab query mi richiede di inserire necessariamete un campo che funge da colonna una da riga e un campo che deve essere i valori che popolano la celle

tipo cosi (esempio preso su uinternet giusto per far capire):

http://www.databasedev.co.uk/image/crosstab_query_design.gif

ora le righe sono il campo tipo_lavoro
le colonne il campo time (col format anni-mesi)
i valori sono il count sul campo pratiche

il fatto è che se nn cè l'intersezione (ovvero la cella dellamatrice èvuota perche nn ho pratiche in quel mese o nn ho pratiche per quel lavoro) mi viene omessa una colonna o una riga mentre io vorrei che fossero inserite (valorizzando a 0 o blank etc. le celle corrispondenti)

john_revelator
16-06-2009, 13:25
Mi spiace ma non sono pratico della griglia di access. La trovo molto "diseducativa".

Per visualizzare gli zeri mancanti nelle colonne ESISTENTI puoi fare così

TRANSFORM nz(Count(AA.Id_Pratica_Ps),0) AS CountOfId_Pratica_Ps

mentre per visualizzare tutti i mesi di uno solo specifico anno puoi usare la query che ti ho indicato, in cui aggiungerai nella clausola where l'anno di tuo interesse. Se invece vuoi visualizzare tutte le colonne mancanti in un range imprecisato che copre diversi anni, quello non è compito di un rdbms. E' un problema di reportistica e in quanto tale lo risolvi con un linguaggio di programmazione, nel tuo caso magari tramite vba.

Micene.1
16-06-2009, 13:27
Mi spiace ma non sono pratico della griglia di access. La trovo molto "diseducativa".

Per visualizzare gli zeri mancanti nelle colonne ESISTENTI puoi fare così

TRANSFORM nz(Count(AA.Id_Pratica_Ps),0) AS CountOfId_Pratica_Ps

mentre per visualizzare tutti i mesi di uno solo specifico anno puoi usare la query che ti ho indicato, in cui aggiungerai nella clausola where l'anno di tuo interesse. Se invece vuoi visualizzare tutte le colonne mancanti in un range imprecisato che copre diversi anni, quello non è compito di un rdbms. E' un problema di reportistica e in quanto tale lo risolvi con un linguaggio di programmazione, nel tuo caso magari tramite vba.

ok grazie mille lo stesso ;)

Micene.1
20-06-2009, 16:10
Mi spiace ma non sono pratico della griglia di access. La trovo molto "diseducativa".

Per visualizzare gli zeri mancanti nelle colonne ESISTENTI puoi fare così

TRANSFORM nz(Count(AA.Id_Pratica_Ps),0) AS CountOfId_Pratica_Ps

mentre per visualizzare tutti i mesi di uno solo specifico anno puoi usare la query che ti ho indicato, in cui aggiungerai nella clausola where l'anno di tuo interesse. Se invece vuoi visualizzare tutte le colonne mancanti in un range imprecisato che copre diversi anni, quello non è compito di un rdbms. E' un problema di reportistica e in quanto tale lo risolvi con un linguaggio di programmazione, nel tuo caso magari tramite vba.

beh si cmq sembra che nn ci sia soluzione...è un limite di sql :O