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

Responder a