2015-03-26 6 views
0

Какой будет лучший способ получить количество людей, нанятых на каждый день недели в течение 7 лет со стола Люди, у которых есть свой entry_date с днем-месяцем, как 01-июня -91.Получить набор целых чисел от счетчика

Например:

 2000 2001 2002 etc.. 

SUN 2 0 1 
MON 0 0 2 

Должен ли я создать счетчик на каждый день каждого года? Как Sun2000, Sun2001 и т. Д.?

+0

Не могли бы вы * прокомментировать, по крайней мере, опубликовать DDL таблицы, содержащей ваши данные? –

ответ

3

Вам необходимо присоединиться к каждому дню недели со своим entry_date и pivot.

SQL Fiddle

Запрос:

with x(days) as (
    select 'sunday' from dual union all 
    select 'monday' from dual union all 
    select 'tuesday' from dual union all 
    select 'wednesday' from dual union all 
    select 'thursday' from dual union all 
    select 'friday' from dual union all 
    select 'saturday' from dual 
) 
select * from (
    select x.days, 
    extract(year from emp.entry_date) entry_year 
    from x left outer join emp 
    on x.days = to_char(emp.entry_date,'fmday') 
) 
pivot(count(entry_year) 
    for entry_year in (
    2007, 
    2008, 
    2009, 
    2010, 
    2011, 
    2012 
    ) 
) 
order by 
    case days when 'sunday' then 1 
     when'monday' then 2 
     when'tuesday' then 3 
     when'wednesday' then 4 
     when'thursday' then 5 
     when'friday' then 6 
     when'saturday' then 7 
    end 

Results:

|  DAYS | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 
|-----------|------|------|------|------|------|------| 
| sunday | 0 | 0 | 0 | 0 | 0 | 0 | 
| monday | 0 | 0 | 0 | 2 | 0 | 0 | 
| tuesday | 0 | 0 | 0 | 0 | 1 | 0 | 
| wednesday | 0 | 0 | 0 | 1 | 2 | 1 | 
| thursday | 0 | 0 | 0 | 0 | 0 | 3 | 
| friday | 0 | 0 | 0 | 0 | 0 | 0 | 
| saturday | 0 | 0 | 0 | 0 | 0 | 0 | 
0

group by на year и entry_date, чтобы получить количество сотрудников, присоединившихся к каждой дате.

Например:

Rem -- Assuming following table structure 
create table People(id number, name varchar2(20), entry_date date); 

Rem -- Following groups the results 
select extract(year from entry_date) "Year", entry_date, count(id) 
from People 
where extract(year from entry_date) between 2008 and 2015 
group by extract(year from entry_date), entry_date 
order by extract(year from entry_date), entry_date; 

this Проверить sqlfiddle исследовать больше.

+0

Я думаю, вы хотите сгруппировать по году и в день недели, а не год и дату. –

+0

@DavidFaber Мои извинения, я упустил это требование. Спасибо, что исправил меня. – learningloop

0

В зависимости от версии Oracle вы используете (10г не имеет функцию PIVOT , например), вы можете попробовать som что-то вроде следующей условной агрегации:

SELECT day_abbrev 
    , SUM(CASE WHEN year_num = 2000 THEN person_cnt ELSE 0 END) AS "2000" 
    , SUM(CASE WHEN year_num = 2001 THEN person_cnt ELSE 0 END) AS "2001" 
    , SUM(CASE WHEN year_num = 2002 THEN person_cnt ELSE 0 END) AS "2002" 
    , SUM(CASE WHEN year_num = 2003 THEN person_cnt ELSE 0 END) AS "2003" 
    , SUM(CASE WHEN year_num = 2004 THEN person_cnt ELSE 0 END) AS "2004" 
    , SUM(CASE WHEN year_num = 2005 THEN person_cnt ELSE 0 END) AS "2005" 
    , SUM(CASE WHEN year_num = 2006 THEN person_cnt ELSE 0 END) AS "2006" 
    FROM (
    SELECT TO_CHAR(entry_date, 'DY') AS day_abbrev 
     , EXTRACT(YEAR FROM entry_date) AS year_num 
     , COUNT(*) AS person_cnt 
     FROM people 
    GROUP BY TO_CHAR(entry_date, 'DY'), EXTRACT(YEAR FROM entry_date) 
) GROUP BY day_abbrev 
ORDER BY TO_CHAR(NEXT_DAY(SYSDATE, day_abbrev), 'D'); 
Смежные вопросы