2015-04-21 4 views
0

Вот мои посещаемость деталей таблицы Emp_ID(varchar),pdate(datetime),attendance(char(2))Получение подсчет всех присутствующих и отсутствующих в одном запросе SQL

enter image description here

я хочу, чтобы получить общее кол attendence дней, общее количество отсутствующего и общего количества присутствующего в одном запросе для определенного диапазона дат группировки по emp_id

+1

Ну, что же вы ждете? Действуй! (другими словами - что вы пробовали до сих пор?) –

+0

Группа Google. Удачи – mxix

+0

@ Zohar Peled: как получить общее количество отсутствующих и общее количество присутствующих, что я должен использовать приговор или дело? – Athul

ответ

2

это работает для меня.

select Emp_ID 
     ,count(case when status ='A' then 1 end) as absent_count 
     ,count(case when status ='P' then 1 end) as present_count 
     ,count(distinct pdate) as Tot_count 
    from MASTERPROCESSDAILYDATA where pdate between '2014-01-01' and '2014-01-31' 
group 
    by Emp_ID ; 
1

Вы должны попробовать что-то вроде этого

SELECT Emp_id, present, absent FROM details 
NATURAL JOIN(
SELECT COUNT(*) AS present FROM details WHERE Emp_id = table.Emp_id AND attendence='P' 
JOIN 
SELECT COUNT(*) AS absent FROM details WHERE Emp_id = table.Emp_id AND attendence='A') AS ctt 
+0

Природные Присоединяйтесь? Не думайте, что это sql-сервер – mxix

3

просто пример пример, чтобы показать вам, как поступить с данными

declare @t table (id int,da date,attend Varchar(2)) 
insert into @t (id,da,attend) values (1,'20141011','P'), 
(1,'20141012','A'), 
    (1,'20141013','P'), 
    (1,'20141014','A'), 
    (1,'20141014','P') 

    select ID,COUNT(da)Total, 
    (select COUNT(da) from @t where attend = 'A')as Absent, 
    (select COUNT(da) from @t where attend = 'P')as Present from @t 
    group by id 
0

Вы можете использовать группу, как уже было продемонстрировано.

Или вы можете использовать функции окна/аналитические функции.

DECLARE @T TABLE (Emp_id INT,pdate DATE,attendance VARCHAR(2)) 
INSERT INTO @t (emp_id,pdate,attendance) VALUES (1,'20141011','P'), 
(1,'20141012','A'), 
(1,'20141013','P'), 
(1,'20141014','A'), 
(1,'20141014','P') 


SELECT 
    DISTINCT 
    EMP_ID, 
    Attendance, 
    COUNT(*) OVER (PARTITION BY attendance) as CntAttendance 
FROM 
    @t 
1

Попробуйте сценарий ниже;

select id, 
     count(distinct pdate) as Total_Attendance_Days, 
     sum(case when attendance= 'p' then 1 else 0 end) Presents, 
     sum(case when att = 'a' then 1 else 0 end) Absents 
from ##TT 
where pdate between '01/04/2015' and '15/04/2015' 
group by id 

Надеется, что это помогает

+0

та же логика, что и я, уже вижу ниже ответ – Athul

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