Программирование >>  Преобразование значений null 

1 ... 104 105 106 [ 107 ] 108 109 110 ... 219


приема на работу первого служащего и первым днем последнего месяца года приема на работу последнего служащего, используется представление V. Значение, возвращенное представлением V, используйте как второй параметр функции GENERATE SERIES, чтобы обеспечить получение верного количества месяцев (строк). Получив все месяцы заданного диапазона дат, проведите внешнее объединение с таблицей EMP и с помощью агрегатной функции COUNT подсчитайте, сколько сотрудников было принято на работу в каждом месяце:

create view v as

select cast(

extract(year from age(last month,first month))*12-1 as integer) as mths

from (

select cast(date trunc(year,min(hiredate)) as date) as first month, cast(cast(date trunc(year,max(hiredate)) as date) + interval 1 year as date) as last month

from emp ) x

1 select y.mth, count(e.hiredate) as num hired

2 from (

3 select cast(e.start date + (x.id * interval 1 month)

4 as date) as mth

5 from generate series (0,(select mths from v)) x(id),

6 ( select cast(

7 date trunc(year,min(hiredate))

8 as date) as start date

9 from emp ) e

10 ) y left join emp e

11 on (y.mth = date trunc(month,e.hiredate))

12 group by y.mth

13 order by 1

MySQL

Чтобы получить все месяцы между 1980 и 1983 годами, используйте сводную таблицу. Затем проведите внешнее объединение с таблицей EMP и с помощью агрегатной функции COUNT подсчитайте, сколько служащих было принято на работу в каждом месяце:

1 select z.mth, count(e.hiredate) num hired

2 from (

3 select date add(min hd,interval t500.id-1 month) mth

4 from (

5 select min hd, date add(max hd,interval 11 month) max hd

6 from (

7 select adddate(min(hiredate),-dayofyear(min(hiredate))+1) min hd,

8 adddate(max(hiredate),-dayofyear(max(hiredate))+1) max hd

9 from emp



) y,

t500

where

date add(min hd,interval t500.id-1 month) <= max hd

) z left join emp e

(z.mth = adddate(

date add(

last day(e.hiredate),interval -1 month),1))

group

by z.mth

order

by 1

SQL Server

Чтобы получить все месяцы (первый день каждого месяца с 1 января 1980 по 1 декабря 1983), используйте рекурсивный оператор WITH. Имея все месяцы заданного диапазона дат, проведите внешнее объединение с таблицей EMP и используйте агрегатную функцию COUNT, чтобы подсчитать, сколько сотрудников было принято на работу в каждом месяце:

x (start date,end date)

(min(hiredate) -

datepart(dy,min(hiredate)start date, dateadd(yy,1, (max(hiredate) -

datepart(dy,max(hiredate)end date emp

dateadd(mm,1,start date), end date

dateadd(mm,1,start date) < end date

x.start date mth, count(e.hiredate) num hired x left join emp e (x.start date =

dateadd(dd,-day(e.hiredate)+1,e.hiredate)) by x.start date

by 1

with

select

from

union

select

from

where

select

from

group

order

Обсуждение DB2

Первый шаг - получить все месяцы (на самом деле первый день каждого месяца) с 1980 по 1983 год. Чтобы найти граничные месяцы, применяем к значениям столбца HIREDATE функцию DAYOFYEAR совместно с функциями MIN и MAX:

select (min(hiredate) -

dayofyear(min(hiredate)) day +1 day) start date, (max(hiredate) -



dayofyear(max(hiredate)) day +1 day) +1 year end date from emp

START DATE END DATE

01-JAN-1980 01-JAN-1984

Следующий шаг - начиная со значения START DATE, последовательно многократно добавляем по одному месяцу. Таким образом получаем все месяцы, необходимые для формирования окончательного результирующего множества. Значение END DATE (1 января 1984 года) на один день больше, чем должно быть. Ничего страшного. При рекурсивном добавлении месяцев к START DATE можно будет остановиться на значении END DATE, не включая его в результирующее множество. Полученные месяцы частично показаны ниже:

with x (start date,end date) as (

select (min(hiredate) -

dayofyear(min(hiredate)) day +1 day) start date, (max(hiredate) -dayofyear(max(hiredate)) day +1 day) +1 year end date from emp union all

select start date +1 month, end date from x

where (start date +1 month) < end date

select * from x

START DATE END DATE

01-JAN-1980 01-JAN-1984 01-FEB-1980 01-JAN-1984 01-MAR-1980 01-JAN-1984

01-OCT-1983 01-JAN-1984 01-NOV-1983 01-JAN-1984 01-DEC-1983 01-JAN-1984

Теперь мы имеем все необходимые месяцы и можем провести внешнее объединение с EMP.HIREDATE. Поскольку в START DATE хранятся первые дни месяцев, значения EMP.HIREDATE необходимо преобразовать в первые дни соответствующих месяцев с помощью функции TRUNC. Наконец, применяем к EMP.HIREDATE агрегатную функцию COUNT.

Oracle

Первый шаг - получить первый день каждого месяца с 1980 по 1983 год. Начинаем с определения граничных месяцев, применяя к значениям



1 ... 104 105 106 [ 107 ] 108 109 110 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика