Ver Mensaje Individual
  #12 (permalink)  
Antiguo 27/11/2013, 12:24
Avatar de Libras
Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 9 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