On Thu, Dec 18, 2014 at 2:27 PM, Danilo Silva <[email protected]>
wrote:
>
> Pessoal, é possível utilizar window function para "melhorar" a select
> abaixo:?
>
> SELECT
> (SELECT COUNT(*) FROM orcamento_venda WHERE (orv_codemp = 1) AND
> (orv_codfilial = 1)) AS totorv
> , (SELECT COUNT(*) FROM orcamento_venda WHERE (orv_codemp = 1) AND
> (orv_codfilial = 1) AND (orv_codsituacao = 5)) AS total
> , (SELECT string_agg(orv_codorcamento::text,',') FROM orcamento_venda
> WHERE (orv_codemp = 1) AND (orv_codfilial = 1) AND (orv_codsituacao = 5))
> AS codigos
> , (ROUND((((SELECT COUNT(*) FROM orcamento_venda WHERE (orv_codemp = 1)
> AND (orv_codfilial = 1) AND (orv_codsituacao = 5)) * 100)::numeric /
> (SELECT COUNT(*) FROM orcamento_venda WHERE (orv_codemp = 1) AND
> (orv_codfilial = 1))::numeric),2)) AS percentual
>
Não me parece o caso para WINDOW FUNCTION, parece-me o caso para um CASE
dentro das funções de agregação:
SELECT
count(CASE WHEN (orv_codemp = 1) AND (orv_codfilial = 1) END) AS
totorv,
count(CASE WHEN (orv_codemp = 1) AND (orv_codfilial = 1) AND
(orv_codfilial = 1) END) AS total,
... -- adapte os demais
FROM orcamento_venda
WHERE (orv_codemp = 1) AND (orv_codfilial = 1) AND ... /* outros
filtros que casam com todos */
Já celebrando o lançamento de hoje, algumas horas atrás, da versão 9.4, o
mesmo ficaria assim na nova versão somente:
SELECT
count(*) FILTER(WHERE (orv_codemp = 1) AND (orv_codfilial = 1)) AS
totorv,
...
Em termos de performance, usar o CASE ou a cláusula FILTER não tem
diferença, mas a sintaxe é bem mais organizada... ;-)
Atenciosamente,
--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral