Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Ignorar columnas en group by

Estas en el tema de Ignorar columnas en group by en el foro de SQL Server en Foros del Web. Hola a todos. Hoy me he topado con el siguiente problema (que en mysql no existe): Tengo la siguiente consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver ...
  #1 (permalink)  
Antiguo 30/06/2014, 10:06
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años, 6 meses
Puntos: 3
Ignorar columnas en group by

Hola a todos.

Hoy me he topado con el siguiente problema (que en mysql no existe):

Tengo la siguiente consulta:

Código MySQL:
Ver original
  1. SELECT cl.cl_nombre as 'Customer',cl.cl_custnumber AS 'Cust Number', mo.mo_nombre AS 'Currency',CONVERT(varchar, CAST(ops.om_faccant AS money), 1) as 'Maximum loan', CONVERT(varchar, CAST(dbo.total_prestamo(ops.om_id) AS money), 1) as 'Cumulative loan' ,CONVERT(varchar, CAST(dbo.AVAILABLE_AMOUNT(ops.om_id , ops.om_faccant)AS money), 1) as 'Available Balance' FROM  
  2.                                          opsmemo ops inner join clientes cl on cl.cl_id = ops.cl_id inner join monedas mo on mo.mo_id = ops.mo_id inner join prestamos  pr on pr.om_id = ops.om_id   where (dbo.total_prestamo(ops.om_id)+(ops.om_faccant*.1)) >= ops.om_faccant group by cl.cl_nombre ,cl.cl_custnumber,ops.om_faccant,pr.om_id , ops.om_id,mo.mo_nombre

Esta consulta devuelve erróneamente 1 registro por cliente, lo cual está mal pues debería devolver un registro por opsmemo (un cliente puede tener varios opsmemo), sin embargo la hice así para que funcionara.

Estuve buscando que hacer para solucionarlo y no entiendo la solución (ni siquiera para dos tablas), entonces me atrevo esta vez a pedir la solución a esta consulta y que me expliquen el funcionamiento para poder hacerlo en futuros casos (y así no volver a pedirles que me resuelvan la vida).

Gracias de antemano y disculpen que les pida la solución directa pero enserio, no entiendo la solución.

PD: les dejo el código solución que encontre (para dos tablas)

Código MySQL:
Ver original
  1. SELECT b.ungroupedColumn,  -- your ungrouped columns
  2.        a.* -- your grouped columns
  3. FROM (SELECT Column1, Column2, sum(Column3)
  4.       FROM mytable
  5.       GROUP BY Column1, Column2) a
  6. INNER JOIN mytable b ON a.Column1 = b.Column1
  #2 (permalink)  
Antiguo 30/06/2014, 10:18
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 2 meses
Puntos: 774
Respuesta: Ignorar columnas en group by

codigo no me sirve para darte una solucin, si pudieras poner un pequeño ejemplo de tus datos y de lo que necesitas, seria mas sencillo darte la solucion :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 30/06/2014, 10:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 11 meses
Puntos: 2658
Respuesta: Ignorar columnas en group by

No te olvides que MySQL tiene capacidades especiales sobrele GROUP BY que no están admitidas en los demás DBMS.
Para lograr cosas similares en SQL Server debes hacer las queries de forma que SQL Server las pueda cumplir. Eventualmente pueden resulta MUY diferentes, o incluso imposibles.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 30/06/2014, 11:45
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Ignorar columnas en group by

Si, al menos en esto MySQL te ahorra hacer lo que ya logré para que funcione como quieres (fue mas sencillo de lo que pensé):

Código MySQL:
Ver original
  1. select cl.cl_nombre as 'Customer',cl.cl_custnumber AS 'Cust Number', ops.mo_nombre AS 'Currency',CONVERT(varchar, CAST(ops.om_faccant AS money), 1) as 'Maximum loan', CONVERT(varchar, CAST(dbo.total_prestamo(ops.om_id) AS money), 1) as 'Cumulative loan',CONVERT(varchar, CAST(dbo.AVAILABLE_AMOUNT(ops.om_id , ops.om_faccant)AS money), 1) as 'Available Balance'
  2. from (select cl_id,om_id,om_faccant,mo_nombre from opsmemo om inner join monedas as mo on mo.mo_id=om.mo_id  group by om_id,cl_id,om_faccant,mo_nombre) ops
  3. inner join clientes cl on cl.cl_id=ops.cl_id order by cl.cl_nombre

No se como se llame lo que estoy haciendo pero lo veo como un tipo de subconsulta con alias en la cual hago los group by y después, en la consulta principal me traigo esos datos a partir del alias de la subconsulta, nada más los ligo en este caso por el id del cliente (cl_id).

La verdad para mi es un truco muy sucio pero es como creo SQL Server quiere que hagas este tipo de cosas, en fin, un punto menos para SQL Server :p
  #5 (permalink)  
Antiguo 30/06/2014, 11:59
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 2 meses
Puntos: 774
Respuesta: Ignorar columnas en group by

Cita:
Iniciado por LOD_Fredy Ver Mensaje
un punto menos para SQL Server :p
Estas en un foro de SQL Server no creo que sea conveniente que digas eso ;) jejejeje, que bien que encontraste la respuesta :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 30/06/2014, 13:14
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Ignorar columnas en group by

Jajaja, lo digo de broma.

Gracias a todos.

Etiquetas: columnas, group, ignorar, registro, select, siguiente, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:57.