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

Responder a