이것은 어떻게 데이터는 것 같습니다. 그것은 긴 테이블
나는 필요의 수를 계산하는 사람들에 의해 고용일
를 작성하는 방법 SQL Server 논리를 이 결과는? I treid 을 만드는 날짜 표와 그 가입하세이지만,이는 오류가 발생하기 때문에 이 테이블은 너무 큽니다. 해야 할 재귀 로직?
미래에 대한 질문을 게시하지 않는 이미지 데이터가 있습니다. 대신에,같은 서비스를 사용 dbfiddle. 나는 어쨌든을 추가 스케치에 대한 응답으로,더 나은 준비된 질문을 입수할 수 있는 완전한 대답합니다. 어쨌든 그것은 여기에 간다:
-- 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;
자신을 찾으면 이런 종류의 계산은 종종 좋은 아이디어를 달력을 만들이다. 추가할 수 있습니다 다른 속성을 같는 경우 그것은 하루에 일주일 등등.
약 조건으로:
CHECK(hired <= retired)
첫 번째 부분에 간단하게 할 수 있:
with extrema(mn, mx) as (
select min(hired) as mn
, max(retired) as mx
from staff
),
고 가정하고 현재 직원 NULL 은퇴 날짜
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
당신은 달력이 필요 테이블이다. 당신은 시작과 함께 일정 및 가입 왼쪽으로 다른 모든 것을 사용하여, BETWEEN
논리입니다.
당신이 사용할 수 있습니다 또는 당신을 생성할 수 있는 비행에 그것은 다음과 같습니다.
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;
면 날짜 시간 구성 요소는 다음을 사용할 필요가 >= AND <
로직
도 제한 범위의 날짜 표입니다. 이 예에서 나는 테이블의 날짜는 이름 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