2013/6/20 Romulo Souza <[email protected]>

> Prezados colegas,
>
> a partir da query:
>
> SELECT * FROM
> (
>  SELECT t.ano,
>        s.sexo,
>        SUM(f.qt_obito) obitos
>   FROM f_sim f
>   JOIN dim_tempo t ON (t.id=f.id_ano)
>   JOIN dim_sexo  s ON (s.id=f.id_sexo)
> GROUP BY t.ano,s.sexo
> ORDER BY t.ano,s.sexo
> ) tb1
>
> como eu faço para obter uma consulta do tipo linha x coluna? O que
> preciso: nas linhas os valores dos anos e nas colunas as quantidades de
> óbitos, segundo sexo. Tentei alterar a query a partir de exemplos que vi
> utilizando crosstab, mas não fui capaz de resolver o problema. Alguém, por
> favor, poderia me auxiliar?
>
>
No seu caso, o modo mais fácil usando a função crosstab da tablefunc [1],
com a variante com dois parâmetros: o primeiro é sua consulta (como já
definiu), a segunda uma consulta que retorne apenas os sexos (M, F). Dessa
forma, mesmo que em algum ano não tenha óbitos dos dois sexos, o resultado
ainda aparecerá (valor null quando não encontrado). Seguindo seu exemplo
ficaria assim (deve testar):

    SELECT * FROM crosstab($$
       SELECT t.ano,
             s.sexo,
             SUM(f.qt_obito) obitos
        FROM f_sim f
        JOIN dim_tempo t ON (t.id=f.id_ano)
        JOIN dim_sexo  s ON (s.id=f.id_sexo)
      GROUP BY t.ano,s.sexo
      ORDER BY t.ano,s.sexo
    $$, $$VALUES('M'),('F')$$
    ) AS tb1(ano int, fem int, masc int);


[1] http://www.postgresql.org/docs/current/static/tablefunc.html#AEN144882

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a