Em 15/04/09, Thiago<[email protected]> escreveu:
> Osvaldo Kussama wrote:
>> 2009/4/15 Thiago <[email protected]>:
>>> Bom dia galera ...
>>>
>>> Estou com uma dúvida que não sei se é possível sanar apenas com SQL,
>>> tenho o seguinte sql:
>>>
>>> select
>>> n.movdatmov as dat_mov,
>>> n.movcodfil as cod_fil,
>>> n.movclapro as cla_pro,
>>> sum(n.movtotite - n.movdesite) as tot_liq
>>> from stfil021_new n
>>> where n.movdatmov between '01/04/2009' and '05/04/2009'
>>> group by n.movclapro, n.movdatmov, n.movcodfil
>>> order by n.movdatmov, n.movcodfil, n.movclapro
>>>
>>> No resultado tenho 8 movclapro diferentes, por tanto terei 8 linhas
>>> diferentes, mas quero que os campos movclapro que seja 1,2 ou 3 venha na
>>> mesma linha e 7 e 8 também venham agrupados, ou seja, somados os valores
>>> ...
>>>
>>> Tem como fazer isso direto por sql ???
>>>
>>
>>
>> Dê uma olhada em CASE:
>> http://www.postgresql.org/docs/current/interactive/functions-conditional.html
>> se eu entendi corretamente.
>>
>
> Então ... não vejo como conseguir o que quero com case ... o que eu
> quero é o seguinte ...
>
> No tenho uma tabela com os seguites campos:
>
> codigo valor
> 1 1
> 1 1
> 2 1
> 2 1
> 3 1
> 3 1
>
> com um select agrupado eu teria o seguinte resultado
>
> select codigo, sum(valor)
> from "tabela"
> group by codigo
>
> codigo sum
> 1 2
> 2 2
> 3 2
>
> eu gostaria que os valores dos códigos 1 e 2 viesses somados ou seja,
> gostaria que meu select viesse da seguinte forma
>
> campo sum
> 1,2 4
> 3 2
>
> e para o a nomenclatura do campo eu poderia dar algum outro nome
> sugestivo ...
>
> tem como fazer isso ???
>
Agora ficou mais claro. Tente algo do tipo:
bdteste=# CREATE TEMP TABLE foo(
bdteste(# codigo int,
bdteste(# valor int);
CREATE TABLE
bdteste=#
bdteste=# INSERT INTO foo VALUES (1, 1), (1, 1), (2, 1), (2, 1), (3, 1), (3, 1);
INSERT 0 6
bdteste=#
bdteste=# SELECT * FROM foo;
codigo | valor
--------+-------
1 | 1
1 | 1
2 | 1
2 | 1
3 | 1
3 | 1
(6 registros)
bdteste=# SELECT array_accum(codigo) AS "Cogigos", sum(val1) AS "Valor"
bdteste-# FROM (SELECT (CASE WHEN codigo=1 THEN 'a' WHEN codigo=2
THEN 'a' WHEN codigo=3 THEN 'b' ELSE 'c' END) AS grupo, codigo,
sum(valor) AS val1
bdteste(# FROM foo GROUP BY codigo ORDER BY codigo) bar
bdteste-# GROUP BY grupo ORDER BY 1;
Cogigos | Valor
---------+-------
{1,2} | 4
{3} | 2
(2 registros)
No CASE coloque os grupamentos desejados.
A função de agregação array_accum está definida em:
http://www.postgresql.org/docs/current/interactive/xaggr.html
Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral