2016-03-18 7 views
0

я следующее:SQL db2 группа по первый день каждого года

id  date_start  date_end 
-----  ----------  -------- 
1a3  2001-12-12  2002-12-12 
23b  2005-01-24  2008-11-02 
11ad  2012-01-15  2014-13-09 
19d  2015-01-23  2016-02-04 

И я хочу, чтобы получить количество каждого человека, где диапазон дат включает в первый день каждого года.

, например, я могу сделать:

select count(distinct id) from table 
where '2001-01-01' between date_start and date_end 

, но я хочу, чтобы произвести подсчет за все годы с 2000-2015. Я хочу, чтобы избежать вручную делать:

select count(distinct id) from table 
where '2001-01-01' between date_start and date_end 

select count(distinct id) from table 
where '2002-01-01' between date_start and date_end 

select count(distinct id) from table 
where '2003-01-01' between date_start and date_end 

Я просто возникли проблемы с визуализацией группу пунктом для this.If я только год я мог сделать:

select count(distinct id), year from table 
group by year 

однако я не могу соответствовать where '2001-01-01' between date_start and date_end в это групповое предложение.

Может ли кто-нибудь помочь?

Спасибо!

ответ

1

Вы можете использовать left join. Вот метод:

select y.yyyy, count(distinct t.id) 
from ((select '2001-01-01' as yyyy from sys.sysdummy) union all 
     (select '2002-01-01' as yyyy from sys.sysdummy) union all 
     (select '2003-01-01' as yyyy from sys.sysdummy) 
    ) y left join 
    table t 
    on y.yyyy between date_start and date_end 
group by y.yyyy 
order by y.yyyy; 
+0

Спасибо, Гордон. Я думаю, что использование фиктивной таблицы здесь ключевое, но я хотел бы избежать жесткого кодирования, если это возможно. – brucezepplin

1

Ну вы только проверить и подсчитать, если год date_start отличается от одного из DATE_END.

select count(*) 
    from table 
where year(date_start) < year(date_end) 
+0

Привет майкл - мне нужно посчитать те, где первый день года находится между диапазоном дат. например, если диапазон дат находится между 2-м днем ​​года и последним днем ​​года, я не хочу считать это. – brucezepplin

+0

Да точно - это то, что он делает :-) Когда date_start - еще один год, как date_end, у вас должен быть новый день в диапазоне. Если год тот же, SQL не будет считать его. Попробуйте это ... – MichaelTiefenbacher

+0

привет Майкл - да, эта логика работает. Я использовал фиктивную таблицу, чтобы использовать эту логику на протяжении всех лет. Я добавлю в качестве ответа – brucezepplin

0

Надеюсь, вы не возражаете, чтобы я ответил на свой вопрос. Используя логику Майкла, я смог объединить это с манекеном - идея из ответа Гордона. вот что я сделал:

with dummy(yr) as (
    select 2000 from SYSIBM.SYSDUMMY1 
    union all 
    select yr + 1 from dummy where yr < 2015 
) 

select d.yr, count(distinct t.id) 
from table t, dummy d 
where d.yr between year(t.date_start) + 1 and year(t.date_end) 
group by d.yr 
order by d.yr 

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

+0

извините, но я думаю, что это слишком сложно для того, что вы хотите ... попробуйте это: SELECT year (date_end), count (отдельный идентификатор) FROM table WHERE year (date_start) MichaelTiefenbacher

+0

это будет считаться только годами, когда диапазон дат включает новый день, следующий за «date_start». Я хотел включить все годы в диапазон дат. например, если у меня было между 2000-02-01 и 2015-02-01, тогда мне нужно было включать этих лиц в подсчеты для каждого года с 2001 по 2015 год. Вот почему я использовал таблицу фиктивных данных для заполнения строк за каждый год в диапазоне дат. – brucezepplin

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