2012-01-15 46 views
5

Soy nuevo en SQL e intentaba hacer una tabla cruzada en Postgres. Lo habría hecho en Excel, pero tengo una base de datos de alrededor de 3.5 millones de filas, 20,000 valores diferentes para el código, 7 categorías en cat y valores variables de 1 a 100. Un código puede tener solo algunas de las 7 categorías.Pestaña cruzada de PostgreSQL con tres columnas con valores sumados de una columna

Excel no puede controlar el número de filas, por lo que SQL es.

Mis datos es en forma

code | cat  | value | 
-------------------------------- 
abc123 | 1   | 4 | 
abc234 | 2   | 6 | 
abc345 | 1   | 1 | 
abc123 | 3   | 2 | 
abc123 | 6   | 12 | 

con código y el gato como texto, como valor entero almacenado en una tabla de Postgres.

Me gustaría realizar una tabla cruzada de código y gato, con suma de valor. Me gustaría mostrar cero en lugar de 'nulo' en el retorno, pero si 'nulo' sería una consulta más simple, estaría bien.

lo que la salida me gustaría es

code | 'cat=0' | 'cat=1' | 'cat=2' | 'cat=3' | 'cat=4' | 'cat=5' | 'cat=6'| 
abc123 | 25  | 0  | 3  | 500 | 250  | 42  | 0  | 
abc234 |  0  | 100 | 0  | 10 | 5  | 0  | 25 | 
abc345 | 1000 | 0  | 0  | 0 | 0  | 0  | 0 | 

He buscado en los archivos de ayuda de Postgres y otros foros; Lo más parecido fue la pregunta PostgreSQL Crosstab Query, pero no pude encontrar la manera de sumar los valores de la tercera columna.

Cualquier ayuda sería muy apreciada.

+0

¿Tiene algo hasta ahora? ;) – plaes

+0

solo frustración ... intenté muchos ejemplos de muchos sitios. incluso haciendo una tabla cruzada simple, obtengo el error 42601 ... no coinciden – Siraj

+0

Sí, pero ¿qué has intentado hasta ahora? – plaes

Respuesta

3

Probar:

select * from crosstab(
'select code, cat, sum(value) as value 
from my_table 
group by code, cat 
order by 1,2' 
) as ct(code text, 
     cat_0 int, 
     cat_1 int, 
     cat_2 int, 
     cat_3 int, 
     cat_4 int, 
     cat_5 int, 
     cat_6 int) 
+2

gracias ... lo intenté, pero obtuve este error ... ERROR: tipo de devolución no válida DETALLE: tipo de datos SQL rowid no coincide con el tipo de datos return rowid. ********** ********** error ERROR: Tipo de declaración estatal SQL no válida: 42601 Detalle: tipo de datos SQL rowid no coincide volver tipo de datos ROWID. – Siraj

+0

lo intenté con count (valor), usando texto en lugar de int después de 'cat_0' etc. aún termina con el mismo error: estado sql: 42601 – Siraj

5

Tengo este trabajo mediante la actualización de mi código a la siguiente:

select * from crosstab(
'select code, cat, sum(value) as value 
from my_table 
group by code, cat 
order by 1,2' 
) as ct(code varchar(255), 
    cat_0 bigint, 
    cat_1 bigint, 
    cat_2 bigint, 
    cat_3 bigint, 
    cat_4 bigint, 
    cat_5 bigint, 
    cat_6 bigint) 

yo era capaz de determinar el tipo de datos correcto mediante la ejecución de la instrucción de selección dentro de la tabla de referencias cruzadas y haciendo coincidir mis tipos de datos como ct con los devueltos por la consulta dentro de la tabla cruzada.

+0

Noté que los nombres de columna cat_XX pueden ser aleatorios, postgres no los combina .. . :( – Chris

+0

@Chris si necesita orden puede intentar esto- SELECCIONAR * FROM tabla de referencias ('su consulta', $$ VALUES ('cat_xx' :: texto), ('cat_xx2' :: texto) $$) –

Cuestiones relacionadas