Discussion:
Group by de mysql a postgresql
felipe fernandez
2011-11-18 09:34:53 UTC
Permalink
Hola

Estoy migrando una base de datos de una web de mysql a postgresql. Los
datos ya están pero las querys que tiene group by son un dolor de cabeza.
Un ejemplo

SELECT users.id, users.username, users.email, users.realname

FROM follow la
JOIN users ON users.id = la.user_id
WHERE users.deleted = 0
GROUP BY users.id

ERROR: column "users.username" must appear in the GROUP BY clause or be
used in an aggregate function
LÍNEA 1: SELECT users.id, users.username, users.email, users.realnam...

He probado a poner DISTINCT quitando el GROUP BY pero el resultado es
erróneo porque muestra TODAS los registros.

¿Existe alguna manera de que sólo se puede agrupar por un único campo del
select?
--
Salu2

Felipe Fernández Rguez
"Uno se alegra de resultar útil" Andrew Martin "El hombre bicentenario"
Isaac Asimov.
"Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing."
Guillermo O. Burastero
2011-11-18 11:15:14 UTC
Permalink
Hola

Tu consulta es en general irresoluble y desde el punto de vista
semántico ambigua.
El agrupamiento implica obtener UN SOLO REGISTRO por CADA DIFERENTE
CLAVE DE AGRUPAMIENTO, por lo tanto en la salida SOLO PUEDEN estar los
campos de la clave de agrupamiento o FUNCIONES DE AGREGADO SOBRE LAS
DEMÁS COLUMNAS. Ej suma o promedio de expresiones numéricas sobre las
demás columnas

Si tengo tabla tPagos (idPersona, fecha, pago) y quiero saber la
totalidad de los pagos por persona (idPersona) hago

SELECT idPersona, summ (pago) from tPagos GROUP by idPersona ORDER by idPersona

Fijate que NO TENDRÍA SENTIDO si hiciera porque una misma persona
puede tener pagos en diferentes fechas.

SELECT idPersona, fecha, summ (pago) from tPagos GROUP by idPersona
ORDER by idPersona

Si en cambio tiene sentido:

SELECT idPersona, fecha, summ (pago) from tPagos GROUP by idPersona,
fecha ORDER by idPersona, fecha

en donde cada registro de salida tiene la suma de todos los pagos
hechos a una persona en una determinada fecha (ya que fecha es también
campo de agrupamiento).

Mirá: http://www.postgresql.org/docs/9.1/static/sql-select.html#SQL-GROUPBY
Hola
Estoy migrando una base de datos de una web de mysql a postgresql. Los datos
ya están pero las querys que tiene group by son un dolor de cabeza.
Un ejemplo
SELECT  users.id, users.username, users.email, users.realname
FROM follow la
JOIN users ON users.id = la.user_id
WHERE users.deleted = 0
GROUP BY users.id
ERROR:  column "users.username" must appear in the GROUP BY clause or be
used in an aggregate function
LÍNEA 1: SELECT  users.id, users.username, users.email, users.realnam...
He probado a poner DISTINCT quitando el GROUP BY pero el resultado es
erróneo porque muestra TODAS los registros.
¿Existe alguna manera de que sólo se puede agrupar por un único campo del
select?
--
Salu2
Felipe Fernández Rguez
"Uno se alegra de resultar útil"  Andrew Martin  "El hombre bicentenario"
Isaac Asimov.
"Documentation is like sex: when it is good, it is very, very good; and when
it is bad, it is better than nothing."
--
Guillermo O. Burastero
Usuario GNU/Linux #84879 - http://counter.li.org/
Bahía Blanca, Buenos Aires, Argentina
Tel. +54 (291) 454-6132 - Móvil [15] 574-3173
MSN: guillermo.burastero-***@public.gmane.org
ICQ: 97148268
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda-RDL/***@public.gmane.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda
felipe fernandez
2011-11-18 11:20:31 UTC
Permalink
Ha rehacer las querys ....

Gracias!
Post by Guillermo O. Burastero
Hola
Tu consulta es en general irresoluble y desde el punto de vista
semántico ambigua.
El agrupamiento implica obtener UN SOLO REGISTRO por CADA DIFERENTE
CLAVE DE AGRUPAMIENTO, por lo tanto en la salida SOLO PUEDEN estar los
campos de la clave de agrupamiento o FUNCIONES DE AGREGADO SOBRE LAS
DEMÁS COLUMNAS. Ej suma o promedio de expresiones numéricas sobre las
demás columnas
Si tengo tabla tPagos (idPersona, fecha, pago) y quiero saber la
totalidad de los pagos por persona (idPersona) hago
SELECT idPersona, summ (pago) from tPagos GROUP by idPersona ORDER by idPersona
Fijate que NO TENDRÍA SENTIDO si hiciera porque una misma persona
puede tener pagos en diferentes fechas.
SELECT idPersona, fecha, summ (pago) from tPagos GROUP by idPersona
ORDER by idPersona
SELECT idPersona, fecha, summ (pago) from tPagos GROUP by idPersona,
fecha ORDER by idPersona, fecha
en donde cada registro de salida tiene la suma de todos los pagos
hechos a una persona en una determinada fecha (ya que fecha es también
campo de agrupamiento).
http://www.postgresql.org/docs/9.1/static/sql-select.html#SQL-GROUPBY
Post by felipe fernandez
Hola
Estoy migrando una base de datos de una web de mysql a postgresql. Los
datos
Post by felipe fernandez
ya están pero las querys que tiene group by son un dolor de cabeza.
Un ejemplo
SELECT users.id, users.username, users.email, users.realname
FROM follow la
JOIN users ON users.id = la.user_id
WHERE users.deleted = 0
GROUP BY users.id
ERROR: column "users.username" must appear in the GROUP BY clause or be
used in an aggregate function
LÍNEA 1: SELECT users.id, users.username, users.email, users.realnam...
He probado a poner DISTINCT quitando el GROUP BY pero el resultado es
erróneo porque muestra TODAS los registros.
¿Existe alguna manera de que sólo se puede agrupar por un único campo del
select?
--
Salu2
Felipe Fernández Rguez
"Uno se alegra de resultar útil" Andrew Martin "El hombre bicentenario"
Isaac Asimov.
"Documentation is like sex: when it is good, it is very, very good; and
when
Post by felipe fernandez
it is bad, it is better than nothing."
--
Guillermo O. Burastero
Usuario GNU/Linux #84879 - http://counter.li.org/
Bahía Blanca, Buenos Aires, Argentina
Tel. +54 (291) 454-6132 - Móvil [15] 574-3173
ICQ: 97148268
-
)
http://www.postgresql.org/mailpref/pgsql-es-ayuda
--
Salu2

Felipe Fernández Rguez
"Uno se alegra de resultar útil" Andrew Martin "El hombre bicentenario"
Isaac Asimov.
"Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing."
Alvaro Herrera
2011-11-18 13:55:46 UTC
Permalink
Post by felipe fernandez
Hola
Estoy migrando una base de datos de una web de mysql a postgresql. Los
datos ya están pero las querys que tiene group by son un dolor de cabeza.
Un ejemplo
SELECT users.id, users.username, users.email, users.realname
FROM follow la
JOIN users ON users.id = la.user_id
WHERE users.deleted = 0
GROUP BY users.id
ERROR: column "users.username" must appear in the GROUP BY clause or be
used in an aggregate function
Prueba una versión más reciente de Postgres. Si los campos que pones en
group by son llave única en las tablas involucradas, el sistema
automáticamente sabe que la agrupación sólo puede entregar un solo
registro por grupo y por lo tanto no te obliga a listas todas las
columnas en el group by. En muchos casos quizás te ahorres el trabajo
de editar las queries.

No recuerdo en qué versión se agregó esta característica.
--
Álvaro Herrera <alvherre-s8A4EuBfO+***@public.gmane.org>
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda-RDL/***@public.gmane.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda
Alejandro Carrillo
2011-11-18 13:59:37 UTC
Permalink
----- Mensaje reenviado -----
Enviado: viernes 18 de noviembre de 2011 8:59
Asunto: Re: [pgsql-es-ayuda] Group by de mysql a postgresql
Normalmente en SQL tu no puedes presentar campos que estén diferentes a los del group by, para casos asi usa funciones de ventana.
________________________________
Enviado: viernes 18 de noviembre de 2011 8:55
Asunto: Re: [pgsql-es-ayuda] Group by de mysql a postgresql
Post by felipe fernandez
Hola
Estoy migrando una base de datos de una web de mysql a postgresql. Los
datos ya estè°©n pero las querys que tiene group by son un dolor de cabeza.
Un ejemplo
SELECT  users.id, users.username, users.email, users.realname
FROM follow la
JOIN users ON users.id = la.user_id
WHERE users.deleted = 0
GROUP BY users.id
ERROR:  column "users.username" must appear in the GROUP BY clause or be
used in an aggregate function
Prueba una versi莞n m谩s reciente de Postgres.  Si los campos que pones en
group by son llave ç…€nica en las tablas
involucradas, el sistema
autom谩ticamente sabe que la agrupaci莞n s莞lo puede entregar un solo
registro por grupo y por lo tanto no te obliga a listas todas las
columnas en el group by.  En muchos casos quiz谩s te ahorres el trabajo
de editar las queries.
No recuerdo en qu茅 versi莞n se agreg莞 esta caracter铆stica.
--
-
http://www.postgresql.org/mailpref/pgsql-es-ayuda
Jaime Casanova
2011-11-18 14:15:51 UTC
Permalink
Post by Alvaro Herrera
No recuerdo en qué versión se agregó esta característica.
http://www.postgresql.org/docs/9.1/static/release-9-1.html
"""
- Allow non-GROUP BY columns in the query target list when the primary
key is specified in the GROUP BY clause (Peter Eisentraut)
The SQL standard allows this behavior, and because of the primary key,
the result is unambiguous.
"""
--
Jaime Casanova         www.2ndQuadrant.com
Professional PostgreSQL: Soporte 24x7 y capacitación
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda-RDL/***@public.gmane.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda
Continúe leyendo en narkive:
Resultados de búsqueda para 'Group by de mysql a postgresql' (Preguntas y respuestas)
8
respuestas
Existe una formula que haga esto?
iniciado 2008-06-20 11:14:48 UTC
diseño y programación
Loading...