2013-06-06 5 views
1

Я новичок в использовании Teradata SQL, и мне нужно ежемесячно рассчитывать количество сотрудников на основе начальных и конечных дат. Скажем, у меня есть четыре данных сотрудников, два из которых до сих пор используемых на 4-30-2012, так это выглядит, как этотSQL - ежемесячно рассчитывается на основе начальных и конечных дат

Emp_ID  join_date   leave_date 
1    1-1-2012   2-02-2012 
2    1-17-2012   3-4-2012 
3    2-1-2012   1-1-9999 
4    3-20-2012   1-1-9999 

Желаемая выход:

MonthEnd   Emp_Count 
1-31-2012   2 
2-29-2012   2 
3-31-2012   1 
4-30-2012   2 

Есть ли более элегантный способ сделать это, чем просто UNION ALL кучу Selects?

select 
'1-31-2012' as MonthEnd 
Count(Emp_ID) as Emp_Count 
where join_date <= MonthEnd and leave_date > MonthEnd 
UNION ALL 
select 
'2-29-2012' as MonthEnd 
Count(Emp_ID) as Emp_Count 
where join_date <= MonthEnd and leave_date > MonthEnd 
UNION ALL 
select 
'3-31-2012' as MonthEnd 
Count(Emp_ID) as Emp_Count 
where join_date <= MonthEnd and leave_date > MonthEnd 
UNION ALL 
select 
'4-30-2012' as MonthEnd 
Count(Emp_ID) as Emp_Count 
where join_date <= MonthEnd and leave_date > MonthEnd 

Также игнорируйте проблемы форматирования данных, поскольку об этом уже заботятся.

ответ

1

Стандартный способ SQL для этого - поместить даты в таблицу или подзапрос, а затем использовать left outer join и group by, чтобы получить подсчеты. Вот пример:

select dates.MonthEnd, COUNT(*) 
from (select cast('2012-01-31' as date) as MonthEnd union all 
     select '2012-02-29' union all 
     . . . 
    ) dates left outer join 
    employees e 
    on e.join_date <= dates.MonthEnd and (e.leave_Date > MonthEnd or e.leave_Date is null) 
group by dates.MonthEnd 
order by dates.MonthEnd; 
0

>

CREATE TABLE Table1 
    ([Emp_ID] int, [join_date] datetime, [leave_date] datetime) 
; 

INSERT INTO Table1 
([Emp_ID], [join_date], [leave_date]) 
VALUES 
(1, '2012-01-01 00:00:00', '2012-02-02 00:00:00'), 
(2, '2012-01-17 00:00:00', '2012-03-04 00:00:00'), 
(3, '2012-02-01 00:00:00', '9999-01-01 00:00:00'), 
(4, '2012-03-20 00:00:00', '9999-01-01 00:00:00') 
; 





declare @output table 
(monthyear nvarchar(10),ENDING_MONTH nvarchar(10)) 


insert into @output 
select convert(nvarchar(5),month(join_date)) + convert(nvarchar(10),year(join_date)) 
as 'monthyear', 
convert(date,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,join_date)+1,0))) as ENDING_MONTH 
from Table1 


select ENDING_MONTH, count(ENDING_MONTH) from @output group by ENDING_MONTH 

sqlfiddle

1

В TD13.10 вы можете использовать расширить, чтобы создать одну строку для каждого месяца в период ЗАНЯТОСТЬ

SELECT MonthEnd, COUNT(*) 
FROM 
(
    SELECT 
     BEGIN(pd) AS MonthEnd 
    FROM tab 
    EXPAND ON PERIOD(join_date, leave_date) AS pd 
    BY ANCHOR MONTH_END -- one row for each month end 
    FOR PERIOD (DATE '2012-01-01', DATE '2012-05-30') -- the range of dates required for output 
) AS dt 
GROUP BY 1 
ORDER BY 1 

Dieter

Смежные вопросы