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

> Prezado Matheus,
>
> muito obrigado pela resposta. Vou implementar a sua solução durante essa
> semana.
>
>
Tranquilo.


> Em 23 de junho de 2013 14:59, Matheus de Oliveira <
> [email protected]> escreveu:
>
>>
>> 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
>>
>>


Um detalhe, vi que está errado a ordem do segundo parâmetro com o alias da
tabela, esta "M,F" nos parâmetros e "fem,masc" nos alias, deveria ser
assim:


    ...
    $$, $$VALUES('F'),('M')$$
    ) AS tb1(ano int, fem int, masc int);


At.
-- 
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