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

[SOLUCIONADO] Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

Estas en el tema de Cantidad de dias laborables (join dim_tiempo y tabla de hechos) en el foro de Bases de Datos General en Foros del Web. Saludos a todos! agradecería mucho su ayuda pues soy nuevo en esto y me enfrento con algo complicado. mi escenario es el siguiente: tengo una ...
  #1 (permalink)  
Antiguo 26/11/2013, 12:41
 
Fecha de Ingreso: noviembre-2013
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

Saludos a todos!

agradecería mucho su ayuda pues soy nuevo en esto y me enfrento con algo complicado.

mi escenario es el siguiente: tengo una tabla dim de tiempo, en la que se encuentra la fecha, dia, mes, año, etc. la primary key es el campo fecha mediante el cual existe una relacion con una tabla de hechos en la que destacan 2 campos principales (fecha_creacion y fecha_cierre), lo que necesito sacar es la cantidad de registros de la tabla dim de tiempo de acuerdo a estas 2 fechas de la tabla de hechos, a modo groso el query que necesito seria algo como "select count(fecha) from DIM_FECHA where fecha between fecha_creacion and fecha_cierre"

alguien podria ayudarme para saber como podria aplicar esta consulta de forma adecuada con los joins y todo lo que implica.

el motor Oracle 11g

de ante mano muchas gracias.
  #2 (permalink)  
Antiguo 26/11/2013, 13:14
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

si ocupas el total de registros lo estas haciendo con el count no??? o que mas ocupas???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 26/11/2013, 15:25
 
Fecha de Ingreso: noviembre-2013
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

Que tal Libras,

intento usar el count(), pero de algun modo no me esta arrojando los datos correctos, mi query hasta ahora es el siguiente:

select count(fecha) as num_registros
from dim_fecha
where
fecha >= ALL(select fecha_creacion from fact) and fecha < ALL (select fecha_cierre from fact).

imagina que los datos en la fact son los siguientes:

| FECHA_CREACION | FECHA_CIERRE |
|2013/08/01 | 2013/08/05 |
|2013/08/02 | 2013/08/08 |
|2013/08/01 | 2013/08/09 |
|etc.. | etc... |

entonces yo quiero ver un resultado como algo asi:

| num_registros |
| 4 |
| 6 |
| 8 |
| etc...|

espero poder explicarme
  #4 (permalink)  
Antiguo 26/11/2013, 15:31
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

necesitarias agrupar tus datos, pero para agruparlos necesitarias un campo comun, que mas datos tiene tu tabla???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 26/11/2013, 16:06
 
Fecha de Ingreso: noviembre-2013
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

esta es mi fact

ID_ticket| FECHA_CREACION | FECHA_CIERRE |
1 |2013/08/01 | 2013/08/05 |
2 |2013/08/02 | 2013/08/08 |
3 |2013/08/01 | 2013/08/06 |
4 |2013/08/01 | 2013/08/09 |
5 |2013/08/01 | 2013/08/04 |
6 |2013/08/01 | 2013/08/03 |
7 |2013/08/01 | 2013/08/09 |
|etc.. | etc... |

esta es mi dim_tiempo

fecha | año | mes | dia
2013/08/01 | 2013 | 8 | 1
2013/08/02 | 2013 | 8 | 2
2013/08/03 | 2013 | 8 | 3
2013/08/04 | 2013 | 8 | 4
2013/08/05 | 2013 | 8 | 5
2013/08/06 | 2013 | 8 | 6
2013/08/07 | 2013 | 8 | 7
2013/08/08 | 2013 | 8 | 8
2013/08/09 | 2013 | 8 | 9
etc.....

necesito un query entre estas 2 tablas para que yo pueda obtener para cada ticket lo siguiente:

ID_ticket| FECHA_CREACION | FECHA_CIERRE | cantidad_dias |
1 |2013/08/01 | 2013/08/05 | 4
2 |2013/08/02 | 2013/08/08 | 6
3 |2013/08/01 | 2013/08/06 | 5
4 |2013/08/01 | 2013/08/09 | 8
5 |2013/08/01 | 2013/08/04 | 3
6 |2013/08/01 | 2013/08/03 | 2
7 |2013/08/01 | 2013/08/09 | 8

todo esto mediante un count(cualquier campo de la dim tiempo) y la condicion que debe ser FECHA_CREACION y FECHA_CIERRE, no puedo usar daysbetween('2013/08/01' , '2013/08/05') o algo similar
  #6 (permalink)  
Antiguo 26/11/2013, 16:22
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

entonces no necesitas contar cuantos registros sino cuantos dias, en oracle puedes manerjar lo siguiente

Código SQL:
Ver original
  1. SELECT id_ticket,fecha_creacion,fecha_cierra, fecha_cierre-fecha_creacion AS dias FROM
  2. dim_fecha
  3. WHERE
  4. fecha >= ALL(SELECT fecha_creacion FROM fact) AND fecha < ALL (SELECT fecha_cierre FROM fact)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 26/11/2013, 16:36
 
Fecha de Ingreso: noviembre-2013
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

gracias por tu repuesta libras, pero que pasa si la dim tiempo cambia de este modo:

fecha | año | mes | dia |dia_laborable |
2013/08/01 | 2013 | 8 | 1 | SI
2013/08/02 | 2013 | 8 | 2 | SI
2013/08/03 | 2013 | 8 | 3 | NO
2013/08/04 | 2013 | 8 | 4 | NO
2013/08/05 | 2013 | 8 | 5 | SI
2013/08/06 | 2013 | 8 | 6 | SI
2013/08/07 | 2013 | 8 | 7 | SI
2013/08/08 | 2013 | 8 | 8 | SI
2013/08/09 | 2013 | 8 | 9 | SI
2013/08/09 | 2013 | 8 | 9 | NO
etc.....

ahora quedaria de este modo el resultado:

ID_ticket| FECHA_CREACION | FECHA_CIERRE | cantidad_dias |
1 |2013/08/01 | 2013/08/05 | 2
2 |2013/08/02 | 2013/08/08 | 4
3 |2013/08/01 | 2013/08/06 | 3
4 |2013/08/01 | 2013/08/09 | 6
5 |2013/08/01 | 2013/08/04 | 2
6 |2013/08/01 | 2013/08/03 | 2
7 |2013/08/01 | 2013/08/09 | 6

es por esta razon que no puedo usar daybetween(), fecha1-fecha2, o algo similar.
espero me puedas ayudar,
de ante mano muchas gracias.
  #8 (permalink)  
Antiguo 26/11/2013, 16:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

en un solo query seria complicado obtener esos datos ya que estas haciendo un producto cartesiano de tu tabla1 contra tabla2 y solo quieres los datos que esten en un rango, podria sacarse con un proceso mas complejo pero un query sencillo no lo creo....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 27/11/2013, 11:04
 
Fecha de Ingreso: noviembre-2013
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

Gracias por tus respuestas libras.

Cres q puedas orientarme para obtener el resultado que necesito¿?
te lo agradeceria mucho
  #10 (permalink)  
Antiguo 27/11/2013, 11:57
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

si pero no en oracle, te podria dar el resultado en sql server
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 27/11/2013, 12:00
 
Fecha de Ingreso: noviembre-2013
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

perfecto, adelante! te lo agradeceré bastante Libras
  #12 (permalink)  
Antiguo 27/11/2013, 12:24
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. fecha datetime,
  4. año INT,
  5. mes INT,
  6. dia INT,
  7. laboral VARCHAR(20)
  8. )
  9. INSERT INTO #temp VALUES ('2013/08/01','2013',8,1,'SI' )
  10. INSERT INTO #temp VALUES ('2013/08/02','2013',8,2,'SI')
  11. INSERT INTO #temp VALUES ('2013/08/03','2013',8,3,'NO')
  12. INSERT INTO #temp VALUES ('2013/08/04','2013',8,4,'NO')
  13. INSERT INTO #temp VALUES ('2013/08/05','2013',8,5,'SI')
  14. INSERT INTO #temp VALUES ('2013/08/06','2013',8,6,'SI')
  15. INSERT INTO #temp VALUES ('2013/08/07','2013',8,7,'SI')
  16. INSERT INTO #temp VALUES ('2013/08/08','2013',8,8,'SI')
  17. INSERT INTO #temp VALUES ('2013/08/09','2013',8,9,'SI')
  18. INSERT INTO #temp VALUES ('2013/08/09','2013',8,9,'NO')
  19.  
  20.  
  21. CREATE TABLE #temp2
  22. (
  23. id INT,
  24. fecha_creacion datetime,
  25. fecha_cierre datetime,
  26. dias INT
  27. )
  28.  
  29. INSERT INTO #temp2 VALUES (1,'2013/08/01','2013/08/05',0)
  30. INSERT INTO #temp2 VALUES (2,'2013/08/02','2013/08/08',0)
  31. INSERT INTO #temp2 VALUES (3,'2013/08/01','2013/08/06',0)
  32. INSERT INTO #temp2 VALUES (4,'2013/08/01','2013/08/09',0)
  33. INSERT INTO #temp2 VALUES (5,'2013/08/01','2013/08/04',0)
  34. INSERT INTO #temp2 VALUES (6,'2013/08/01','2013/08/03',0)
  35. INSERT INTO #temp2 VALUES (7,'2013/08/01','2013/08/09',0)
  36.  
  37.  
  38.  
  39. DECLARE @dias INT
  40. DECLARE @x INT
  41. DECLARE @id INT
  42. SET @x=1
  43. SET @id=0
  44. SELECT *,IDENTITY(INT,1,1) AS rn INTO #temp3 FROM #temp2
  45.  
  46. while @x<=(SELECT COUNT(*) FROM #temp3)
  47. BEGIN
  48.     SELECT @id=id FROM #temp3 WHERE rn=@x
  49.     SELECT @dias=SUM(dias) FROM
  50.     (
  51.     SELECT CASE WHEN laboral='SI' THEN 1 END AS dias FROM #temp
  52.     WHERE fecha BETWEEN (SELECT fecha_creacion FROM #temp2 WHERE id=@x) AND (SELECT fecha_cierre FROM #temp2 WHERE id=@x)
  53.     ) t1
  54.     UPDATE #temp2
  55.     SET dias=@dias
  56.     WHERE id=@x
  57.     SET @x=@x+1
  58. END
  59. DROP TABLE #temp3
  60. SELECT * FROM #temp2

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 27/11/2013, 12:42
 
Fecha de Ingreso: noviembre-2013
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Cantidad de dias laborables (join dim_tiempo y tabla de hechos)

Muchas gracias por el aporte Libras, se reconoce tu esfuerzo.
intentare replicar de algún modo tu solución en mi BD en oracle 11g.
Gracias de nuevo.
saludos!

Etiquetas: campo, cantidad, dias, join, registro, 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 03:17.