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