Veja se é isso que deseja:

SELECT * FROM (

        SELECT ano, cod_cliente, nome_cliente, max(desconto) as desconto
        FROM (
                SELECT EXTRACT(YEAR FROM data_empr) AS ano, cod_cliente,
nome_cliente, SUM(valor_desc) AS desconto
                FROM emprestimos e INNER JOIN clientes ON (cod_cliente = 
codigo_cliente)
                WHERE data_empr BETWEEN '2004-01-01' AND '2007-12-31'
                GROUP BY ano, cod_cliente, nome_cliente
        ) T
        GROUP BY ano, cod_cliente, nome_cliente
        ORDER BY desconto DESC LIMIT 4 -- Somente 4 anos distintos no
intervalo entre 2004 e 2007
) D
ORDER BY ano
;


William Leite Araújo
Mobile Solution Manager       - QualiConsult
Analista de Banco de Dados



Em 19 de maio de 2010 17:12, Marcos Bernardelli
<[email protected]> escreveu:
> Senhores, bom dia!
>
> Estou realizando alguns testes a mérito de aprendizado, encontrei
> dificuldades em montar um SELECT. Possuo um cenário de uma vídeo locadora
> onde existem duas tabelas “clientes“ e “emprestimos“ conforme definição
> abaixo:
>
>
>
> CREATE TABLE clientes
>
> (
>
>   codigo_cliente integer NOT NULL,
>
>   nome_cliente character(42),
>
> );
>
>
>
>
>
> CREATE TABLE emprestimos
>
> (
>
>   cod_filme integer NOT NULL,
>
>   cod_cliente integer NOT NULL,
>
>   data_empr date NOT NULL,
>
>   valor_desc numeric(7,2),
>
> );
>
>
>
>
>
> Estou tentando recuperar quais clientes tiveram o maior desconto nas
> locações em 2004, 2005, 2006 e 2007, ou seja, a consulta deve retornar a
> seguinte informação:
>
>
>
> Ano    cod_cliente    nome_cliente   desconto
>
> --------------------------------------------------
>
> 2004   10             fulano         17,23
>
> 2005   56             beltrano       56,23
>
> 2005   89             teste          56,23
>
> 2006   12             o cara         13,26
>
> 2007   55             nene           16,23
>
>
>
>
>
> Fiz da seguinte maneira:
>
>
>
> SELECT EXTRACT(YEAR FROM data_empr) AS ano, cod_cliente, nome_cliente,
> SUM(valor_desc) AS desconto FROM emprestimos e
>
> INNER JOIN clientes ON (cod_cliente = codigo_cliente)
>
> WHERE data_empr BETWEEN '2004-01-01' AND '2007-12-31'
>
> GROUP BY ano, cod_cliente, nome_cliente
>
> HAVING SUM(valor_desc) = (
>
>        SELECT MAX(desconto) FROM (
>
>              SELECT SUM(valor_desc) AS desconto FROM EMPRESTIMOS
>
>                WHERE EXTRACT(YEAR FROM data_empr) = 2004  -- Não consigo
> filtrar o ano (EXTRACT(YEAR FROM data_empr) AS ano)
>
>                GROUP BY cod_cliente) AS tmp_emp )
>
> ORDER BY cod_cliente, nome_cliente;
>
>
>
> Porém, não consegui obter o resultado desejado, pois no HAVING não consegui
> filtrar o ano que está no grupo de informações do SELECT, fiz de forma
> manual (no exemplo somente 2004).
>
>
>
> Alguém tem alguma sugestão?
>
> Seria dessa forma mesmo, fazendo UNION com vários anos?
>
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a