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

Agrupar con Nulos

Estas en el tema de Agrupar con Nulos en el foro de SQL Server en Foros del Web. Hola la consulta que llevo horas intentando hacer, en vez de explicarlo porque me costará más, pongo un ejemplo que es el siguiente. tengo Usuario,Jornada ...
  #1 (permalink)  
Antiguo 14/03/2011, 13:30
Avatar de triqui  
Fecha de Ingreso: diciembre-2008
Ubicación: Zaragoza(España)
Mensajes: 624
Antigüedad: 15 años, 3 meses
Puntos: 31
Agrupar con Nulos

Hola la consulta que llevo horas intentando hacer, en vez de explicarlo porque me costará más, pongo un ejemplo que es el siguiente.

tengo Usuario,Jornada y saldo.


Select Usuario,Jornada, Max(Saldo) from Tabla group by Usuario,Jornada order by Jornada,Usuario.

Esto me devuelve lo siguiente:

Usuario -Semana- Saldo
Pedro - 1 - 5000
Juan - 1 - 4000
Carlos - 1 - 2000
Pedro - 3 - 3000
Juan - 4 - 1000


Lo que estoy intentando es por cada semana que el resto de usuario muestre la misma semana pero con saldo nulo:

Usuario- Semana-Saldo
Pedro 1 5000
Juan 1 4000
Carlos 1 2000
Pedro 3 3000
Juan 3 NULL
Carlos 3 NULL

Pedro 4 NULL
Juan 4 1000
Carlos 4 NULL

Las columnas rojas son las que se han creado ya que por lo menos un usuario tiene saldo para esa semana, stoy perdidisimo !!

muchas gracias
__________________
La nueva red social de quinielas quiniela resultados
Cazaresultados Futbol base en directo
  #2 (permalink)  
Antiguo 14/03/2011, 14:51
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 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.
  #3 (permalink)  
Antiguo 14/03/2011, 18:51
Avatar de triqui  
Fecha de Ingreso: diciembre-2008
Ubicación: Zaragoza(España)
Mensajes: 624
Antigüedad: 15 años, 3 meses
Puntos: 31
Respuesta: Agrupar con Nulos

me fue de maravilla,

los nulos no me funcionaba tuve que hacer un -1, y luego hacer otro case para los -1 = Null. Pero vamos de lujo.

gracias !!
__________________
La nueva red social de quinielas quiniela resultados
Cazaresultados Futbol base en directo

Etiquetas: agrupar, nulos
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 16:52.