viernes, julio 02, 2010

crosstab para consultas de tablas cruzadas

Esta no le he necesitado aún, pero me puse a revisarla para ver qué tal funciona y ver sí luego se le puede sacar provecho.

La documentación oficial[0] habla por sí sola, sobre lo que se quiere. hacerla funcionar no es complicado, pero tiene su engaño.

Lo que se tiene:

SELECT est_002::text, agri02_002::text, count(*)::numeric
FROM consulta_agri04 GROUP BY agri02_002, est_002 ORDER BY est_002, agri02_002;
est_002 | agri02_002 | count
----------+------------------------+-------
Mérida | CACAO | 83
Mérida | CAFE | 169
Mérida | CAÑA | 68
Mérida | CEREALES Y LEGUMINOSAS | 421
Mérida | FRUTALES | 746
Mérida | HORTALIZAS | 1277
Mérida | ORNAMENTALES | 41
Mérida | RAICES Y TUBERCULOS | 484
Táchira | CACAO | 12
Táchira | CAFE | 29
Táchira | CAÑA | 1
Táchira | CEREALES Y LEGUMINOSAS | 310
Táchira | FRUTALES | 209
Táchira | HORTALIZAS | 451
Táchira | RAICES Y TUBERCULOS | 222
Trujillo | CAFE | 26
Trujillo | CAÑA | 20
Trujillo | CEREALES Y LEGUMINOSAS | 97
Trujillo | FRUTALES | 174
Trujillo | HORTALIZAS | 361
Trujillo | RAICES Y TUBERCULOS | 127
Lo que se quiere:

est_002 |CACAO |CAFE |CAÑA
Mérida |83 |169 |68
Táchira |12 |29 |1
Trujillo | |26 |20
con ésta consulta verifico cuántas columnas tendré:
SELECT DISTINCT agri02_002 FROM consulta_agri04 ORDER BY agri02_002, ya que luego voy a necesitar esa información para definir la salida.

SELECT est_002, agri02_002, count(*)::numeric

Acá defindo, como primer campo, la columna pivote, el segunda campo, serán las columnas, y el tercer campo, los valores a rellenar en la tabla.

Acá defino as columnas de salida en la tabla:
AS lista(estado text, renglon1 text, renglon2 text, renglon3 text, renglon4 text, renglon5 text, renglon6 text, renglon7 text, renglon8 text)

primer campo, el pivot, los demás serán tantos como me devuelva la consulta con el DISTINCT.

De esta amnera, la consulta completa queda:
SELECT * FROM public.crosstab
(
'SELECT est_002, agri02_002, count(*)::numeric FROM consulta_agri04 GROUP BY agri02_002, est_002 ORDER BY est_002, agri02_002',
'SELECT DISTINCT agri02_002 FROM consulta_agri04 ORDER BY agri02_002'
) AS lista(estado text, renglon1 text, renglon2 text, renglon3 text, renglon4 text, renglon5 text, renglon6 text, renglon7 text, renglon8 text);

y devuelve:
estado | renglon1 | renglon2 | renglon3 | renglon4 | renglon5 | renglon6 | renglon7 | renglon8
----------+----------+----------+----------+----------+----------+----------+----------+----------
Mérida | 83 | 169 | 68 | 421 | 746 | 1277 | 41 | 484
Táchira | 12 | 29 | 1 | 310 | 209 | 451 | | 222
Trujillo | | 26 | 20 | 97 | 174 | 361 | | 127
(3 filas)



[0]http://www.postgresql.org/docs/8.3/interactive/tablefunc.html

No hay comentarios.: