Cómo extrapolar las fechas en SQL Server para calcular el diario cuenta?

0

Pregunta

Esta es la forma en que los datos se parece. Es una mesa larga

enter image description here

Necesito calcular el número de personas empleadas por día

enter image description here

Cómo escribir lógica de SQL Server para obtener este resultado? Yo treid para crear una tabla de FECHAS y, a continuación, unirse, pero esto provocó un error, ya que la tabla es demasiado grande. Necesito una lógica recursiva?

sql sql-server tsql
2021-11-23 19:56:48
4
0

Para las preguntas en el futuro, no se pueden publicar imágenes de datos. En su lugar, utilizar un servicio como dbfiddle. De todos modos voy a agregar un boceto para una respuesta, con un mejor preparados pregunta que usted podría haber conseguido una respuesta completa. De todos modos aquí va:

-- extrema is the least and the greatest date in staff table
with extrema(mn, mx) as (
    select least(min(hired),min(retired)) as mn
         , greatest(max(hired),max(retired)) as mx
    from staff
), calendar (dt) as (
    -- we construct a calendar with every date between extreme values
    select mn from extrema
    union all
    select dateadd(day, 1, d)
    from calendar
    where dt < (select mx from extrema)
)
-- finally we can count the number of employed people for each such date
select dt, count(1) 
from calendar c 
join staff s
    on c.dt between s.hired and s.retired
group by dt; 

Si usted se encuentra haciendo este tipo de cálculo a menudo, es una buena idea para crear un calendario de mesa. Usted puede agregar otros atributos, tales como si es un día en el medio de la semana, etc.

Con una restricción como:

CHECK(hired <= retired)

la primera parte se puede simplificar a:

with extrema(mn, mx) as (
    select min(hired) as mn
         , max(retired) as mx
    from staff
),
2021-11-23 20:45:14
0

Suponiendo que los Empleados Actuales tienen un valor NULO de la fecha de jubilación

Declare @Date1 date = '2015-01-01'
Declare @Date2 date = getdate()

Select A.Date
      ,HeadCount = count(B.name)
 From ( Select Top (DateDiff(DAY,@Date1,@Date2)+1) 
               Date=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@Date1) 
         From  master..spt_values n1,master..spt_values n2
      ) A
 Left Join YourTable B on A.Date >= B.Hired and A.Date <= coalesce(B.Retired,getdate())
 Group BY A.Date
2021-11-23 20:34:49
0

Usted necesita un calendario de mesa para el este. De empezar con el calendario, y de IZQUIERDA a UNIRSE a todo lo demás, el uso de BETWEEN de la lógica.

Puede utilizar una mesa real. O puede generar sobre la marcha, como este:

WITH
    L0 AS ( SELECT c = 1
            FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),
                        (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ),
    L1 AS ( SELECT c = 1 FROM L0 A, L0 B, L0 C, L0 D ),
    Nums AS ( SELECT rownum = ROW_NUMBER() OVER(ORDER BY (SELECT 1))
              FROM L1 ),
    Dates AS (
      SELECT TOP (DATEDIFF(day, '20141231', GETDATE()))
        Date = DATEADD(day, rownum, '20141231')
      FROM Nums
    )

SELECT
  d.Date,
  NumEmployed = COUNT(*)
FROM Dates d
JOIN YourTable t ON d.Date BETWEEN t.Hired AND t.Retired
GROUP BY
  d.Date;

Si tus fechas tienen un componente de tiempo, entonces usted necesita utilizar >= AND < la lógica

2021-11-23 20:49:37
0

Trate de limitar el alcance de su fecha de tabla. En este ejemplo tengo una tabla de fechas nombre TallyStickDT.

SELECT dt, COUNT(name)
FROM (
    SELECT dt
    FROM tallystickdt
    WHERE dt >= (SELECT MIN(hired) FROM #employees)
    AND dt <= GETDATE()
) A
LEFT OUTER JOIN #employees E ON A.dt >= E.Hired AND A.dt <= e.retired
GROUP BY dt
ORDER BY dt
2021-11-23 20:44:03

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................