Ver Mensaje Individual
  #2 (permalink)  
Antiguo 14/03/2011, 14:51
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Agrupar con Nulos

Hola triqui:

Tu consulta no es nada sencilla así es que si funciona lo que te voy a colocar espero algo de karma jejeje... no te creas, todo es con el afán de ayudar.

prueba con esto:

Código SQL:
Ver original
  1. DECLARE @tabla TABLE (usuario VARCHAR(10), jornada INT, saldo INT)
  2. INSERT INTO @tabla VALUES ('Pedro', 1, 5000)
  3. INSERT INTO @tabla VALUES ('Pedro', 1, 3000)
  4. INSERT INTO @tabla VALUES ('Juan', 1, 3000)
  5. INSERT INTO @tabla VALUES ('Juan', 1, 4000)
  6. INSERT INTO @tabla VALUES ('Carlos', 1, 2000)
  7. INSERT INTO @tabla VALUES ('Carlos', 1, 1000)
  8. INSERT INTO @tabla VALUES ('Pedro', 3, 3000)
  9. INSERT INTO @tabla VALUES ('Pedro', 3, 2000)
  10. INSERT INTO @tabla VALUES ('Juan', 4, 1000)
  11. INSERT INTO @tabla VALUES ('Juan', 4, 500)
  12.  
  13. --Si ejecutas tu sentencia se obtiene el resultado que mencionas
  14. SELECT Usuario, jornada, MAX(Saldo) saldo FROM @Tabla GROUP BY Usuario, jornada ORDER BY jornada, Usuario
  15.  
  16. --Para agregar los registros con null
  17. SELECT DISTINCT * FROM (
  18. SELECT T1.usuario, T2.jornada, CASE WHEN (T1.jornada = T2.jornada) THEN saldo ELSE NULL END saldo
  19. FROM (SELECT usuario, jornada, MAX(saldo) saldo FROM @Tabla GROUP BY usuario, jornada) T1, (SELECT DISTINCT jornada FROM @tabla) T2) Tx
  20. WHERE Tx.saldo IS NOT NULL OR NOT EXISTS
  21. (SELECT * FROM @Tabla T3 WHERE T3.usuario = Tx.usuario AND T3.jornada = Tx.jornada)
  22. ORDER BY Tx.jornada, Tx.usuario

Para tratar de explicar un poco la idea es hacer un producto carteciano de los registros contra las jornadas, es por eso que hago esto:

Código:
from (select usuario, jornada, max(saldo) saldo from @Tabla group by usuario, jornada) T1, 
(select distinct jornada from @tabla) T2
Si observas el select de la T1 corresponde al select que estás ejecutando para obtener el máximo saldo por usuario-jornada, el select de T2 es para obtener todas las jornadas existentes en la tabla. Una vez que obtengo el producto carteciano (es decir, cada usuario contra todas las jornadas) simplemente filtro la información que no necesito, te recomiendo que vayas ejecutando parte por parte la consulta es decir, primero lo del "centro" e ir incorporando lo demás.

Creo que debe funcionar, no estoy seguro de que sea la manera más óptima de hacerlo pero seguiré pensando en otra alternativa, si encuentro alguna forma más sencilla de realizar esto lo publico mañana

Saludos.
Leo.