Re: [pgsql-es-ayuda] Consulta sobre groupo by

2014-10-07 Por tema Alvaro Herrera
Felipe Araoz Ramos escribió:
> Buen dia amigos del foro.
> 
> Tengo una funcion que hace varios agrupaciones para un balance de
> comprobacion, una para los saldos iniciales, para los movimientos, etc y
> los voy uniendo con union all.  Mi problema radica cuando quiero agrupar
> por un campo extrayendo los 2,3 o 4, digitos iniciales de la cuenta, segun
> el parametro $4.  He estado haciendo esto:
> 
> SELECT
>   substring(fpcdet.m_ccta,1,$4) as m_ccta,
>   SUM(CASE WHEN fpcdet.M_ACCI='D' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
> SI_DEBE,
>   SUM(CASE WHEN fpcdet.M_ACCI='H' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
> SI_HABE,
>   0.00 AS MV_DEBE,0.00 AS MV_HABE,0.00 AS SA_DEBE,0.00 AS SA_HABE
> FROM
>   fpcdet inner join fpccab on
>   fpcdet.m_empr=fpccab.m_empr and
>   fpcdet.m_anop=fpccab.m_anop and
>   fpcdet.m_mesp=fpccab.m_mesp and
>   fpcdet.m_grup=fpccab.m_grup and
>   fpcdet.m_ncom=fpccab.m_ncom
>   where fpcdet.m_empr=$1 and fpcdet.M_anop=$2 and fpcdet.M_MESP<$3 and
> fpccab.m_cont='S'
> GROUP BY fpcdet.m_ccta   Con esto no me funciona bien,
> pero si le coloco
> GROUP BY 1  , me funciona bien, pero no se si es lo mas correcto   O seria
> mas conveniente;
> GROUP BY  substring(fpcdet.m_ccta,1,$4).

Si no me equivoco, un literal numérico en el GROUP BY hace referencia a
un número de columna de salida, así que es lo mismo "GROUP BY 1" que
"GROUP BY substring(...)".

Si pones una definición en el GROUP BY que es igual a la columna de
salida, se ejecutará una sola vez y usará el mismo resultado para ambos,
así que la ejecución de cualquiera de las dos variantes será la misma.
(Puedes verificar esto poniendo una función marcada IMMUTABLE que haga
"RAISE NOTICE" y retorne el substring de tu interés).  Si marcas la
función VOLATILE no sé cómo se comporta, pero es posible que ejecute
separadamente para la columna de salida que para el GROUP BY.  Otra
prueba que puedes hacer es concatenar con un string vacío para que veas
que se ejecuta una vez más:

GROUP BY substring(...) || ''

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

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


Re: [pgsql-es-ayuda] Consulta sobre groupo by

2014-10-07 Por tema felix gonzales
Estimado Felipe

es recomendable que la disgregación de cuentas lo haga en el proceso de
"mayorización"  y en el caso de tu balance con un simple sql tendrías lo
que necesitas (mucho mas rápido para presentar resultados al usuario)

saludos!


2014-10-07 9:38 GMT-05:00 Emanuel Calvo :

>
> El 07/10/14 a las 10:55, Felipe Araoz Ramos escibió:
> >
> > Buen dia amigos del foro.
> >
> > Tengo una funcion que hace varios agrupaciones para un balance de
> > comprobacion, una para los saldos iniciales, para los movimientos, etc
> > y los voy uniendo con union all.  Mi problema radica cuando quiero
> > agrupar por un campo extrayendo los 2,3 o 4, digitos iniciales de la
> > cuenta, segun el parametro $4.  He estado haciendo esto:
> >
> > SELECT
> >   substring(fpcdet.m_ccta,1,$4) as m_ccta,
> >   SUM(CASE WHEN fpcdet.M_ACCI='D' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
> > SI_DEBE,
> >   SUM(CASE WHEN fpcdet.M_ACCI='H' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
> > SI_HABE,
> >   0.00 AS MV_DEBE,0.00 AS MV_HABE,0.00 AS SA_DEBE,0.00 AS SA_HABE
> > FROM
> >   fpcdet inner join fpccab on
> >   fpcdet.m_empr=fpccab.m_empr and
> >   fpcdet.m_anop=fpccab.m_anop and
> >   fpcdet.m_mesp=fpccab.m_mesp and
> >   fpcdet.m_grup=fpccab.m_grup and
> >   fpcdet.m_ncom=fpccab.m_ncom
> >   where fpcdet.m_empr=$1 and fpcdet.M_anop=$2 and fpcdet.M_MESP<$3 and
> > fpccab.m_cont='S'
> > GROUP BY fpcdet.m_ccta   Con esto no me funciona bien,
> > pero si le coloco
> > GROUP BY 1  , me funciona bien, pero no se si es lo mas correcto   O
> > seria mas conveniente;
> > GROUP BY  substring(fpcdet.m_ccta,1,$4).
> >
>
> No soy amigo de utilizar funciones que se ejecuten por cada fila.
> Yo dejaría el GROUP BY m_ccta . Aún así te aconsejo que hagas el
> EXPLAIN ANALYZE de cada consulta y analices el comportamiento con
> tus datos.
>
> Si vas a compartir los explain usa: explain.depesz.com
>
> --
> --
> Emanuel Calvo http://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Training & Services
>
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>



-- 
Felix Gonzales


Re: [pgsql-es-ayuda] Consulta sobre groupo by

2014-10-07 Por tema Emanuel Calvo

El 07/10/14 a las 10:55, Felipe Araoz Ramos escibió:
>
> Buen dia amigos del foro.
>
> Tengo una funcion que hace varios agrupaciones para un balance de
> comprobacion, una para los saldos iniciales, para los movimientos, etc
> y los voy uniendo con union all.  Mi problema radica cuando quiero
> agrupar por un campo extrayendo los 2,3 o 4, digitos iniciales de la
> cuenta, segun el parametro $4.  He estado haciendo esto:
>
> SELECT 
>   substring(fpcdet.m_ccta,1,$4) as m_ccta,
>   SUM(CASE WHEN fpcdet.M_ACCI='D' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
> SI_DEBE,
>   SUM(CASE WHEN fpcdet.M_ACCI='H' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
> SI_HABE,
>   0.00 AS MV_DEBE,0.00 AS MV_HABE,0.00 AS SA_DEBE,0.00 AS SA_HABE
> FROM
>   fpcdet inner join fpccab on
>   fpcdet.m_empr=fpccab.m_empr and
>   fpcdet.m_anop=fpccab.m_anop and
>   fpcdet.m_mesp=fpccab.m_mesp and
>   fpcdet.m_grup=fpccab.m_grup and  
>   fpcdet.m_ncom=fpccab.m_ncom   
>   where fpcdet.m_empr=$1 and fpcdet.M_anop=$2 and fpcdet.M_MESP<$3 and
> fpccab.m_cont='S'
> GROUP BY fpcdet.m_ccta   Con esto no me funciona bien, 
> pero si le coloco 
> GROUP BY 1  , me funciona bien, pero no se si es lo mas correcto   O
> seria mas conveniente;
> GROUP BY  substring(fpcdet.m_ccta,1,$4).
>

No soy amigo de utilizar funciones que se ejecuten por cada fila.
Yo dejaría el GROUP BY m_ccta . Aún así te aconsejo que hagas el
EXPLAIN ANALYZE de cada consulta y analices el comportamiento con
tus datos.

Si vas a compartir los explain usa: explain.depesz.com

-- 
--
Emanuel Calvo http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services


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


Re: [pgsql-es-ayuda] Consulta sobre groupo by

2014-10-07 Por tema Gilberto Castillo


> Buen dia amigos del foro.
>
> Tengo una funcion que hace varios agrupaciones para un balance de
> comprobacion, una para los saldos iniciales, para los movimientos, etc y
> los voy uniendo con union all.  Mi problema radica cuando quiero agrupar
> por un campo extrayendo los 2,3 o 4, digitos iniciales de la cuenta, segun
> el parametro $4.  He estado haciendo esto:
>
> SELECT
>   substring(fpcdet.m_ccta,1,$4) as m_ccta,
>   SUM(CASE WHEN fpcdet.M_ACCI='D' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
> SI_DEBE,
>   SUM(CASE WHEN fpcdet.M_ACCI='H' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
> SI_HABE,
>   0.00 AS MV_DEBE,0.00 AS MV_HABE,0.00 AS SA_DEBE,0.00 AS SA_HABE
> FROM
>   fpcdet inner join fpccab on
>   fpcdet.m_empr=fpccab.m_empr and
>   fpcdet.m_anop=fpccab.m_anop and
>   fpcdet.m_mesp=fpccab.m_mesp and
>   fpcdet.m_grup=fpccab.m_grup and
>   fpcdet.m_ncom=fpccab.m_ncom
>   where fpcdet.m_empr=$1 and fpcdet.M_anop=$2 and fpcdet.M_MESP<$3 and
> fpccab.m_cont='S'
> GROUP BY fpcdet.m_ccta   Con esto no me funciona bien,
> pero si le coloco
> GROUP BY 1  , me funciona bien, pero no se si es lo mas correcto   O seria
> mas conveniente;
> GROUP BY  substring(fpcdet.m_ccta,1,$4).
>
> Gracias por sus respuestas.

¿Has probado utilizar además un Order by?


Saludos,
Gilberto Castillo
La Habana, Cuba
--- 
This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running at 
host imx3.etecsa.cu
Visit our web-site: , 
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


[pgsql-es-ayuda] Consulta sobre groupo by

2014-10-07 Por tema Felipe Araoz Ramos
Buen dia amigos del foro.

Tengo una funcion que hace varios agrupaciones para un balance de
comprobacion, una para los saldos iniciales, para los movimientos, etc y
los voy uniendo con union all.  Mi problema radica cuando quiero agrupar
por un campo extrayendo los 2,3 o 4, digitos iniciales de la cuenta, segun
el parametro $4.  He estado haciendo esto:

SELECT
  substring(fpcdet.m_ccta,1,$4) as m_ccta,
  SUM(CASE WHEN fpcdet.M_ACCI='D' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
SI_DEBE,
  SUM(CASE WHEN fpcdet.M_ACCI='H' THEN fpcdet.M_IMPN ELSE 0.00 END) AS
SI_HABE,
  0.00 AS MV_DEBE,0.00 AS MV_HABE,0.00 AS SA_DEBE,0.00 AS SA_HABE
FROM
  fpcdet inner join fpccab on
  fpcdet.m_empr=fpccab.m_empr and
  fpcdet.m_anop=fpccab.m_anop and
  fpcdet.m_mesp=fpccab.m_mesp and
  fpcdet.m_grup=fpccab.m_grup and
  fpcdet.m_ncom=fpccab.m_ncom
  where fpcdet.m_empr=$1 and fpcdet.M_anop=$2 and fpcdet.M_MESP<$3 and
fpccab.m_cont='S'
GROUP BY fpcdet.m_ccta   Con esto no me funciona bien,
pero si le coloco
GROUP BY 1  , me funciona bien, pero no se si es lo mas correcto   O seria
mas conveniente;
GROUP BY  substring(fpcdet.m_ccta,1,$4).

Gracias por sus respuestas.


*Felipe Araoz Ramos*
RPM #941990605 / 941990605
RPC 992760385
 NXT  822*9500 / 998229500