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 originalDECLARE @tabla TABLE (usuario VARCHAR(10), jornada INT, saldo INT)
INSERT INTO @tabla VALUES ('Pedro', 1, 5000)
INSERT INTO @tabla VALUES ('Pedro', 1, 3000)
INSERT INTO @tabla VALUES ('Juan', 1, 3000)
INSERT INTO @tabla VALUES ('Juan', 1, 4000)
INSERT INTO @tabla VALUES ('Carlos', 1, 2000)
INSERT INTO @tabla VALUES ('Carlos', 1, 1000)
INSERT INTO @tabla VALUES ('Pedro', 3, 3000)
INSERT INTO @tabla VALUES ('Pedro', 3, 2000)
INSERT INTO @tabla VALUES ('Juan', 4, 1000)
INSERT INTO @tabla VALUES ('Juan', 4, 500)
--Si ejecutas tu sentencia se obtiene el resultado que mencionas
SELECT Usuario, jornada, MAX(Saldo) saldo FROM @Tabla GROUP BY Usuario, jornada ORDER BY jornada, Usuario
--Para agregar los registros con null
SELECT DISTINCT * FROM (
SELECT T1.usuario, T2.jornada, CASE WHEN (T1.jornada = T2.jornada) THEN saldo ELSE NULL END saldo
FROM (SELECT usuario, jornada, MAX(saldo) saldo FROM @Tabla GROUP BY usuario, jornada) T1, (SELECT DISTINCT jornada FROM @tabla) T2) Tx
WHERE Tx.saldo IS NOT NULL OR NOT EXISTS
(SELECT * FROM @Tabla T3 WHERE T3.usuario = Tx.usuario AND T3.jornada = Tx.jornada)
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.