|
Программирование >> Преобразование значений null
приема на работу первого служащего и первым днем последнего месяца года приема на работу последнего служащего, используется представление 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
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
Обсуждение 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 год. Начинаем с определения граничных месяцев, применяя к значениям
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |