Re: Consulta sobre groupo by

From: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
To: Felipe Araoz Ramos <faraoz(at)gmail(dot)com>
Cc: PostgreSQL-foro <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Consulta sobre groupo by
Date: 2014-10-07 15:27:51
Message-ID: 20141007152751.GM7043@eldon.alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 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 Gilberto Castillo 2014-10-07 15:35:49 Re: fecha de un registro en una tabla
Previous Message Linder Poclaba Lazaro 2014-10-07 15:19:27 Re: fecha de un registro en una tabla