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

[SOLUCIONADO] Incluir meses sin registros dentro de un año a partir del mes actual

Estas en el tema de Incluir meses sin registros dentro de un año a partir del mes actual en el foro de SQL Server en Foros del Web. Hola amigos quería consultarles como puedo hacer si tengo una tabla con datos en la cual hago una selección simple de los productos que tengo ...
  #1 (permalink)  
Antiguo 18/08/2014, 12:13
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 4 meses
Puntos: 0
Incluir meses sin registros dentro de un año a partir del mes actual

Hola amigos quería consultarles como puedo hacer si tengo una tabla con datos en la cual hago una selección simple de los productos que tengo a partir del año y mes actual, lo que necesito es mostrar esta selección incluyendo lo meses en que no tengo registro de estos productos pero que estén dentro de los 12 meses siguientes a partir del mes actual.
El resultado debería ser este:

producto Año Mes Cantidad
1001 2014 8 50
1001 2014 9 300
1001 2014 10 0
1001 2014 11 0
1001 2014 12 0
1001 2015 1 150
1001 2015 2 100
1001 2015 3 0
1001 2015 4 0
1001 2015 5 0
1001 2015 6 0
1001 2015 7 0
1002 2014 8 0
1002 2014 9 0
1002 2014 10 50
1002 2014 11 80
1002 2014 12 0
1002 2015 1 0
1002 2015 2 0
1002 2015 3 0
1002 2015 4 0
1002 2015 5 0
1002 2015 6 0
1002 2015 7 0

Datos..

CREATE TABLE #mitabla(
Producto VARCHAR(04),
Anio INT,
Mes INT,
Cantidad NUMERIC(16,8)
)
GO

INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,6,200)
INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,7,100)
INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,8,50)
INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,9,300)
INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2015,1,150)
INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2015,2,100)
INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1002',2014,10,50)
INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1002',2014,11,80)

Gracias de antemano por su ayuda.
  #2 (permalink)  
Antiguo 18/08/2014, 12:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Una base de datos trabaja con datos reales, no imaginarios. Si no hay registros no los puede representar ni calcular.
Tienes dos soluciones: O los pones programticamente, o los creas en una tabla temporal.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 18/08/2014, 13:14
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Un poco complicado entender el contexto de lo que me recomiendas pero entiendo que necesitas la base de datos real y que no te ayudan los insert que puse de datos y que siga investigando. Gracias gnzsoloyo (=
  #4 (permalink)  
Antiguo 18/08/2014, 13:49
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Es muy simple la solución, tienes registros que hacen mención a MESES y por ende, NO TENDRAS algunos meses que tengas información.

"Dadme un base y moveré al mundo"

Debes crear una tabla con LOS MESES del 01 ENERO al 12 DICIEMBRE y hacer una relación de ambas tablas, aquellos registros que se presenten como NULL, son aquellos que NO TIENEN INFORMACION.

¿Me explique?
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 18/08/2014, 14:07
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Si pero al parecer funciona si solo es un producto, no por cada uno de los productos que se tengan.
  #6 (permalink)  
Antiguo 18/08/2014, 14:26
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, 4 meses
Puntos: 774
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Cita:
Iniciado por iislas Ver Mensaje
Es muy simple la solución, tienes registros que hacen mención a MESES y por ende, NO TENDRAS algunos meses que tengas información.

"Dadme un base y moveré al mundo"

Debes crear una tabla con LOS MESES del 01 ENERO al 12 DICIEMBRE y hacer una relación de ambas tablas, aquellos registros que se presenten como NULL, son aquellos que NO TIENEN INFORMACION.

¿Me explique?
Exacto exacto amigo iislas es lo que he estado pensando para resolver esto :P pero como si no hay query no lo entienden:
Código SQL:
Ver original
  1. CREATE TABLE #mitabla(
  2. Producto VARCHAR(04),
  3. Anio INT,
  4. Mes INT,
  5. Cantidad NUMERIC(16,8)
  6. )
  7. GO
  8.  
  9. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,6,200)
  10. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,7,100)
  11. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,8,50)
  12. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,9,300)
  13. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2015,1,150)
  14. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2015,2,100)
  15. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1002',2014,10,50)
  16. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1002',2014,11,80)
  17.  
  18.  
  19. CREATE TABLE #meses
  20. (
  21. anio INT,
  22. mes INT,
  23. producto INT
  24. )
  25.  
  26.  
  27. SELECT DISTINCT anio,producto, IDENTITY(INT,1,1) AS rn INTO
  28. #temp FROM #mitabla
  29.  
  30. DECLARE @x INT
  31. DECLARE @y INT
  32. DECLARE @anio INT
  33. DECLARE @producto INT
  34. SET @x=1
  35. SET @y=1
  36. while @x<=(SELECT COUNT(*) FROM #temp)
  37. BEGIN
  38.     SELECT @anio=anio,@producto=producto FROM #temp WHERE rn=@x
  39.     while @y<=12
  40.         BEGIN
  41.             INSERT INTO #meses VALUES (@anio,@y,@producto)
  42.             SET @y=@y+1
  43.         END
  44.     SET @y=1
  45. SET @x=@x+1
  46. END
  47.  
  48. SELECT t2.producto,t2.anio,t2.mes,isnull(t1.cantidad,0) AS cantidad FROM #mitabla AS t1
  49. RIGHT JOIN #meses AS t2 ON (t1.Mes=t2.mes AND t1.Anio=t2.anio)
  50.  
  51.  
  52. DROP TABLE #temp
  53. DROP TABLE #meses
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 18/08/2014, 14:42
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Gracias por tu valiosa ayuda Libras!, ahora tratare de adaptarlo a mi necesidad pues el resultado que esperaba era como el que indicaba, mostrar los 12 meses para cada producto pero a partiendo del mes actual (en este caso si estamos agosto debe partir del mes 8, en septiembre partir del mes 9 y así sucesivamente)..
  #8 (permalink)  
Antiguo 18/08/2014, 14:44
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, 4 meses
Puntos: 774
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

y para los años anteriores empieza en 1??? Mientras mas claro el requerimiento mejor la respuesta ;)

Código SQL:
Ver original
  1. CREATE TABLE #mitabla(
  2. Producto VARCHAR(04),
  3. Anio INT,
  4. Mes INT,
  5. Cantidad NUMERIC(16,8)
  6. )
  7. GO
  8.  
  9. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,6,200)
  10. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,7,100)
  11. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,8,50)
  12. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,9,300)
  13. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2015,1,150)
  14. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2015,2,100)
  15. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1002',2014,10,50)
  16. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1002',2014,11,80)
  17.  
  18.  
  19. CREATE TABLE #meses
  20. (
  21. anio INT,
  22. mes INT,
  23. producto INT
  24. )
  25.  
  26.  
  27. SELECT DISTINCT anio,producto, IDENTITY(INT,1,1) AS rn INTO
  28. #temp FROM #mitabla
  29.  
  30. DECLARE @x INT
  31. DECLARE @y INT
  32. DECLARE @anio INT
  33. DECLARE @producto INT
  34. DECLARE @actual INT
  35. SET @actual=datepart(yyyy,getdate())
  36. SET @x=1
  37. SET @y=1
  38. while @x<=(SELECT COUNT(*) FROM #temp)
  39. BEGIN
  40.     SELECT @anio=anio,@producto=producto FROM #temp WHERE rn=@x
  41.     IF @anio=@actual   
  42.         SET @y=datepart(mm,getdate())
  43.     while @y<=12
  44.         BEGIN
  45.             INSERT INTO #meses VALUES (@anio,@y,@producto)
  46.             SET @y=@y+1
  47.         END
  48.     SET @y=1
  49. SET @x=@x+1
  50. END
  51.  
  52. SELECT t2.producto,t2.anio,t2.mes,isnull(t1.cantidad,0) AS cantidad FROM #mitabla AS t1
  53. RIGHT JOIN #meses AS t2 ON (t1.Mes=t2.mes AND t1.Anio=t2.anio)
  54.  
  55.  
  56. DROP TABLE #temp
  57. DROP TABLE #meses

aqui el query con el cambio que mencionas ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 18/08/2014, 15:29
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Gracias Libras de igual manera estoy modificando pues no me funciona para mas de un producto el resultado que requiero es el del primer post..
  #10 (permalink)  
Antiguo 18/08/2014, 15:31
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Por eso, precisamente por eso, yo no le invierto tanto tiempo.....
__________________
MCTS Isaias Islas
  #11 (permalink)  
Antiguo 18/08/2014, 15:43
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Comprendo tu aptitud amigo. (;
  #12 (permalink)  
Antiguo 18/08/2014, 15:50
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, 4 meses
Puntos: 774
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

ok, ya entendi que ocupas, pero esto sera solo para 2 años?? que pasa si tienes 2 productos y 3 años diferentes o no es el caso??? de no ser este el caso tu query queda asi:

Código SQL:
Ver original
  1. CREATE TABLE #mitabla(
  2. Producto VARCHAR(04),
  3. Anio INT,
  4. Mes INT,
  5. Cantidad NUMERIC(16,8)
  6. )
  7. GO
  8.  
  9. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,6,200)
  10. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,7,100)
  11. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,8,50)
  12. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2014,9,300)
  13. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2015,1,150)
  14. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1001',2015,2,100)
  15. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1002',2014,10,50)
  16. INSERT INTO #mitabla(Producto, Anio, Mes, Cantidad) VALUES('1002',2014,11,80)
  17.  
  18.  
  19. CREATE TABLE #meses
  20. (
  21. anio INT,
  22. mes INT,
  23. producto INT
  24. )
  25.  
  26.  
  27. SELECT DISTINCT producto, IDENTITY(INT,1,1) AS rn INTO
  28. #temp
  29.  FROM #mitabla ORDER BY producto
  30.  
  31. DECLARE @x INT
  32. DECLARE @y INT
  33. DECLARE @z INT
  34. DECLARE @anio INT
  35. DECLARE @producto INT
  36. DECLARE @actual INT
  37. SET @actual=datepart(yyyy,getdate())
  38. SET @x=1
  39. SET @y=1
  40. SET @z=1
  41. SET @anio=@actual
  42. while @x<=(SELECT COUNT(*) FROM #temp)
  43. BEGIN
  44.     SELECT @producto=producto FROM #temp WHERE rn=@x
  45.     SET @y=DATEPART(mm,getdate())
  46.     while @z<=12
  47.         BEGIN
  48.             INSERT INTO #meses VALUES (@anio,@y,@producto)
  49.             SET @y=@y+1
  50.             IF @y=12
  51.                 BEGIN
  52.                     SET @y=1
  53.                     SET @anio=@anio+1
  54.                 END
  55.             SET @z=@z+1
  56.         END
  57.     SET @y=1
  58.     SET @z=1
  59.     SET @anio=@actual
  60. SET @x=@x+1
  61. END
  62.  
  63. SELECT t2.producto,t2.anio,t2.mes,isnull(t1.cantidad,0) AS cantidad FROM #mitabla AS t1
  64. RIGHT JOIN #meses AS t2 ON (t1.Mes=t2.mes AND t1.Anio=t2.anio AND t1.Producto=t2.producto)
  65.  
  66.  
  67.  
  68. DROP TABLE #temp
  69. DROP TABLE #meses
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 18/08/2014, 15:51
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, 4 meses
Puntos: 774
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Cita:
Iniciado por iislas Ver Mensaje
Por eso, precisamente por eso, yo no le invierto tanto tiempo.....
Sirve para aprender amigo, quizas el que pregunta no aprenda mucho de estos casos pero a parte de que me entretienen me ayudan a sacar logica para otros problemas quizas no iguales pero si parecidos jejejejejeje, aunque a veces puede ser desesperante :S
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #14 (permalink)  
Antiguo 18/08/2014, 16:18
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

Descuida que estoy aprendiendo de todo esto Libras, en mi escenario no existirá mas de 2 años diferentes por producto, funciona bien aunque modifique la línea
IF @y=12 por IF @y>12 pues no mostraba nunca el mes 12 pero ya funciona bien (; (ves que si reviso y aprendo)
Gracias por el conocimiento y tanta paciencia Libras!!
  #15 (permalink)  
Antiguo 18/08/2014, 16:24
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, 4 meses
Puntos: 774
Respuesta: Incluir meses sin registros dentro de un año a partir del mes actual

:apla uso:
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: actual, año, incluir, meses, registros, 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 11:19.