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

Responder a