Re: query con count

From: FRANCISCO JOSE PALAO VILLANUEVA <fjpv_2000(at)yahoo(dot)es>
To: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: query con count
Date: 2014-06-05 19:13:18
Message-ID: 1401995598.99131.YahooMailNeo@web172605.mail.ir2.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola,
pues pienso que se lía, ya que no me devuelve todas las filas de tabla p_d y encima me devuelve filas de tabla p_c donde pr_id es mayor que 11 cuando pone < 11.
Lo he resuelto de la siguiente forma:

with clientes as (select pd_id as agente,count(pc_id) as truta,pr_id from p_c where pbv_id = 805 and pc_tipocli = 1 and pr_id < 11
                  and pc_d5 < '01/02/2014' and pc_pc between 0 and 999 group by pd_id,pr_id)
   Select p_d.pd_id,truta,clientes.pr_id from p_d left outer join clientes on (p_d.pd_id=clientes.agente) where
   pd_zona= '3' or pd_zona='7' or pd_zona='2' or pov_id=805
   order by p_d.pd_id,clientes.pr_id

Así si que funciona ok forzándole a crear el conjunto clientes primero.

La traducción de la query es tabla p_d (vendedores) tabla p_c clientes, cuenta clientes de oficina 805 de unas determinadas características agrupados por pd_id código vendedor y por pr_id ruta de venta, pero debe de listar todos los vendedores que pertenecen a la oficina 805 o son de tipo 7 , 2 o 3 tipos especiales que pueden vender donde sea.

Saludos

De: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
Para: FRANCISCO JOSE PALAO VILLANUEVA <fjpv_2000(at)yahoo(dot)es>
CC: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Enviado: Jueves 5 de junio de 2014 19:02
Asunto: Re: [pgsql-es-ayuda] query con count

FRANCISCO JOSE PALAO VILLANUEVA escribió:
> Hola,
> tengo una query de la siguiente manera:
>
> Select t1.pd_id,count(t2.pc_id) as truta,t2.pr_id from p_d t1 left outer join p_c t2 on t1.pd_id=t2.pd_id where (t1.pov_id = 805 or t1.pd_zona='2' or t1.pd_zona='3' or t1.pd_zona='7') and t2.pbv_id = 805 and t2.pc_tipocli = 1 and t2.pr_id < 11 and t2.pc_d5 < '01/02/2014' and t2.pc_pc between 0 and 999 group by t1.pd_id,t2.pr_id order by t1.pd_id,t2.pr_id
>
> Bien esta me devuelve sólo tuplas donde t1.pd_id=t2.pd_id ??? es un left outer join, debería devolver todas las tuplas de la tabla p_d que cumplan que la condición (t1.pov_id = 805 or t1.pd_zona='2' or t1.pd_zona='3' or t1.pd_zona='7') y las que no se crucen con valores de la tabla p_c debería devolver por ejemplo:
> 490,null,null
> Por lo menos así lo hace la base de datos desde donde estoy migrando.
>
> De hecho si lanzo la consulta:
> Select t1.pd_id,count(t2.pc_id) as truta,t2.pr_id from p_d t1 left outer join p_c t2 on t1.pd_id=t2.pd_id where  t2.pbv_id = 805 and t2.pc_tipocli = 1 and t2.pr_id < 11 and t2.pc_d5 < '01/02/2014' and t2.pc_pc between 0 and 999 group by t1.pd_id,t2.pr_id order by t1.pd_id,t2.pr_id
>
> o así:
> Select t2.pd_id,count(t2.pc_id) as truta,t2.pr_id from p_d t1 left outer join p_c t2 on t1.pd_id=t2.pd_id where (t1.pov_id = 805 or t1.pd_zona='2' or t1.pd_zona='3' or t1.pd_zona='7') and t2.pbv_id = 805 and t2.pc_tipocli = 1 and t2.pr_id < 11 and t2.pc_d5 < '01/02/2014' and t2.pc_pc between 0 and 999 group by t2.pd_id,t2.pr_id order by t2.pd_id,t2.pr_id
> el resultado es el mismo ???

Es bien difícil leer tus consultas, pero quizás el problema puede ser
que tus condiciones en el WHERE permiten determinar que las filas con
pr_id nulo no deben emitirse, por ej. tienes t2.pr_id < 11, ¿no deberías
indicar (t2.pr_id < 11 OR t2.pr_id IS NULL)?  Igual para las condiciones
en pc_d5 y el BETWEEN, quizás necesitan un "OR foo IS NULL" para poder
cumplirse para las tuplas que se completan de nulls.

> yo por lo que he visto en otros gestores de bd esto funciona mal en
> postgresql. No hace caso al left outer join, está haciendo un join
> normal

--
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message jvenegasperu . 2014-06-09 15:39:10 Problema de espacio en disco duro postgres sobre windows
Previous Message Alvaro Herrera 2014-06-05 17:02:22 Re: query con count