On Mon, Jun 8, 2015 at 3:00 PM, Matheus Saraiva <[email protected]>
wrote:
> SELECT
> "PESSOAS".nome_pessoa,
> "CLIENTES".rg_cliente,
> "CLIENTES".cpf_cliente,
> "ESTADIAS".quarto_estadia,
> "ESTADIAS".entrada_estadia,
> CURRENT_DATE - DATE("ESTADIAS".entrada_estadia) AS diarias,
> "ESTADIAS".valor_estadia,
> SUM("LIGACOES".valortotal_ligacao) AS totalligacoes
> FROM
> "ESTADIAS"
> JOIN
> "PESSOAS" ON "PESSOAS".id_pessoa = "ESTADIAS".cliente_estadia
> JOIN
> "CLIENTES" ON "CLIENTES".pessoa_cliente =
> "ESTADIAS".cliente_estadia
> JOIN
> "LIGACOES" ON "LIGACOES".quarto_ligacao = "ESTADIAS".quarto_estadia
> AND
> "LIGACOES".datahora_ligacao >= "ESTADIAS".entrada_estadia
> WHERE
> "ESTADIAS".id_estadia = 1
>
Uma opção seria adicionar todas as chaves primárias de cada tabela, exceto
a LIGACOES, no GROUP BY. Veja que quando você tem uma função de agregação,
todas as colunas listadas no SELECT devem:
1. Estar na clausula GROUP BY *ou*,
2. Pertencer a uma tabela cujo a chave primária está na clausula GROUP BY
*ou*,
3. Estar na chamada de uma função de agregação.
Outra opção no seu caso (possivelmente melhor) seria usar uma subconsulta
na tabela LIGACOES já trazendo a soma total. Uma forma interessante de
fazer isso é usar a clausula LATERAL, se estiver na versão 9.4:
...
"ESTADIAS".cliente_estadia
JOIN LATERAL(
SELECT SUM("LIGACOES".valortotal_ligacao) AS totalligacoes
FROM "LIGACOES"
WHERE
"LIGACOES".quarto_ligacao = "ESTADIAS".quarto_estadia
AND "LIGACOES".datahora_ligacao >= "ESTADIAS".entrada_estadia
) l ON true
WHERE
...
De qualquer forma, tem certeza que não deveria filtrar a saida_estadia pela
datahora_ligacao também?
Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral