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