Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / RS2005 Среднее за неделю / 5 сообщений из 5, страница 1 из 1
19.12.2011, 16:48
    #37583480
Коля77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS2005 Среднее за неделю
Разворачиваю матрицу.
Есть ресурсы и задачи с процентом загрузки за день.
Если месяц развернут по дням, то все считается правильно.
Если данные по неделям, то среднее считается не правильно.
Есть указатель рабочий день или нет.
Необходимо сумму процентов поделить на посчитанное количество рабочих дней.
Загвоздка в подсчете рабочих дней. Как это можно осуществить VS2005?
1234567891011121314Пн.ВвСрЧтПтСбНдПнВвСрЧтПтСбНдИвановзадача 2757575757575задача 31010656565
...
Рейтинг: 0 / 0
20.12.2011, 11:44
    #37584574
RS2005 Среднее за неделю
У нас куча подобных отчетов, где рабочие дни/часы надо посчитать в разрезе кварталов, месяцев, недель...
Делаем всё на стороне SQL-сервера (выборки, кстати, выполняются очень быстро), а в Reporting`e только разворачиваем данные.

По мотивам нашего форума
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
-- Последовательность год\месяц, если известны даты начала и конца периода.
declare @DataBegin datetime, @DataEnd datetime

select @DataBegin = '20101031', @DataEnd = '20110201'
select convert(varchar,@DataBegin,104) [@DataBegin], convert(varchar,@DataEnd,104) [@DataEnd]

select datepart(yy, dateadd(mm, number, @DataBegin)) [yy], datepart(mm, dateadd(mm, number, @DataBegin)) [mm]
from master..spt_values v
where v.type = 'p' and v.number <= datediff(mm, @DataBegin, @DataEnd)

-- Ну и соответственно последовательность год\квартал, если известны даты начала и конца периода.
select datepart(yy, dateadd(qq, number, @DataBegin)) [yy], datepart(qq, dateadd(qq, number, @DataBegin)) [qq]
from master..spt_values v
where v.type = 'p' and v.number <= datediff(qq, @DataBegin, @DataEnd)



Нужно написать запрос, который бы возвращал суммы в разрезе месяцев...
функции year, month + group by

Лучше
GROUP BY DATEDIFF(MONTH,0,[date])




-- Для столбца таблицы
set dateformat dmy

declare @t table (id int, DataBegin date, DataEnd date)
insert @t values (1,	'31.01.2011','01.05.2011')
insert @t values (2,	'20.12.2010','06.03.2011')

select id, convert(varchar,DataBegin,104) [DataBegin], convert(varchar,DataEnd,104) [DataEnd] from @t

select id, dateadd(m, b+number, 0) d from
(select id, datediff(m, 0, DataBegin) b, datediff(m, 0, DataEnd) e from @t) t 
cross join master..spt_values v 
where v.type ='P' and (v.number between 0 and (e-b))

...
Рейтинг: 0 / 0
20.12.2011, 11:46
    #37584577
RS2005 Среднее за неделю
Коля77Загвоздка в подсчете рабочих дней. У Вас как я понял есть таблица календарь?
...
Рейтинг: 0 / 0
20.12.2011, 16:25
    #37585296
Коля77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS2005 Среднее за неделю
Совершенно верно, есть таблица календаря с где дни помечены рабочий день или выходной.
...
Рейтинг: 0 / 0
21.12.2011, 19:28
    #37587658
RS2005 Среднее за неделю
Коля77,
небольшой пример за август (понедельник - первое число)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
set nocount on
set dateformat dmy
set language russian

declare @calendar table (Data datetime, IsWork int)

;with cte(num) as (
 select 0
 union all
 select num+1 from cte where num < 364
)
insert into @calendar (Data, IsWork)
 select dateadd(dd, num, '01.01.2011'), 1 from cte option (maxrecursion 0)


-- Выходные и праздники
update @calendar
set IsWork = 0 
where (Data between '01.01.2011' and '10.01.2011')
or Data in   ('15.01.2011', '16.01.2011', '22.01.2011', '23.01.2011', '29.01.2011', '30.01.2011', '05.02.2011', '06.02.2011', '12.02.2011',
'13.02.2011', '19.02.2011', '20.02.2011', '23.02.2011', '26.02.2011', '27.02.2011', '06.03.2011', '07.03.2011', '08.03.2011', '12.03.2011',
'13.03.2011', '19.03.2011', '20.03.2011', '26.03.2011', '27.03.2011', '02.04.2011', '03.04.2011', '09.04.2011', '10.04.2011', '16.04.2011',
'17.04.2011', '23.04.2011', '24.04.2011', '30.04.2011', '01.05.2011', '02.05.2011', '07.05.2011', '08.05.2011', '09.05.2011', '14.05.2011',
'15.05.2011', '21.05.2011', '22.05.2011', '28.05.2011', '29.05.2011', '04.06.2011', '05.06.2011', '11.06.2011', '12.06.2011', '13.06.2011',
'18.06.2011', '19.06.2011', '25.06.2011', '26.06.2011', '02.07.2011', '03.07.2011', '09.07.2011', '10.07.2011', '16.07.2011', '17.07.2011',
'23.07.2011', '24.07.2011', '30.07.2011', '31.07.2011', '06.08.2011', '07.08.2011', '13.08.2011', '14.08.2011', '20.08.2011', '21.08.2011',
'27.08.2011', '28.08.2011', '03.09.2011', '04.09.2011', '10.09.2011', '11.09.2011', '17.09.2011', '18.09.2011', '24.09.2011', '25.09.2011',
'01.10.2011', '02.10.2011', '08.10.2011', '09.10.2011', '15.10.2011', '16.10.2011', '22.10.2011', '23.10.2011', '29.10.2011', '30.10.2011',
'04.11.2011', '05.11.2011', '06.11.2011', '12.11.2011', '13.11.2011', '19.11.2011', '20.11.2011', '26.11.2011', '27.11.2011', '03.12.2011',
'04.12.2011', '10.12.2011', '11.12.2011', '17.12.2011', '18.12.2011', '24.12.2011', '25.12.2011', '31.12.2011')


-- Сам календарь за 2011 год в удобочитаемом виде
--select convert(varchar, Data, 104) [Дата], IsWork from @calendar where datepart(yy,data) = 2011 order by Data

declare @t table (fio varchar(1024), task varchar(1024), data datetime, work int)
insert @t
  select 'Иванов', 'Задача 2', '01.08.2011', 75 union all  select 'Иванов', 'Задача 2', '02.08.2011', 75 union all
  select 'Иванов', 'Задача 2', '03.08.2011', 75 union all  select 'Иванов', 'Задача 2', '04.08.2011', 75 union all
  select 'Иванов', 'Задача 2', '05.08.2011', 75 union all  select 'Иванов', 'Задача 2', '06.08.2011', 0 union all
  select 'Иванов', 'Задача 2', '07.08.2011', 0 union all  select 'Иванов', 'Задача 2', '08.08.2011', 75 union all
  select 'Иванов', 'Задача 2', '09.08.2011', 0 union all  select 'Иванов', 'Задача 2', '10.08.2011', 0 union all
  select 'Иванов', 'Задача 2', '11.08.2011', 0 union all  select 'Иванов', 'Задача 2', '12.08.2011', 0 union all
  select 'Иванов', 'Задача 2', '13.08.2011', 0 union all  select 'Иванов', 'Задача 2', '14.08.2011', 0 union all
  
  select 'Иванов', 'Задача 3', '01.08.2011', 0 union all  select 'Иванов', 'Задача 3', '02.08.2011', 0 union all
  select 'Иванов', 'Задача 3', '03.08.2011', 10 union all  select 'Иванов', 'Задача 3', '04.08.2011', 10 union all
  select 'Иванов', 'Задача 3', '05.08.2011', 0 union all  select 'Иванов', 'Задача 3', '06.08.2011', 0 union all
  select 'Иванов', 'Задача 3', '07.08.2011', 0 union all  select 'Иванов', 'Задача 3', '08.08.2011', 0 union all
  select 'Иванов', 'Задача 3', '09.08.2011', 0 union all  select 'Иванов', 'Задача 3', '10.08.2011', 65 union all
  select 'Иванов', 'Задача 3', '11.08.2011', 65 union all  select 'Иванов', 'Задача 3', '12.08.2011', 65 union all
  select 'Иванов', 'Задача 3', '13.08.2011', 0 union all  select 'Иванов', 'Задача 3', '14.08.2011', 0
  
select t.fio, t.task, t.work
, datepart(dd, t.data) [День месяца]
, case c.IsWork when 1 then left(datename(dw, t.data), 3) else 'НД' end [День недели]
, sum(work) over (partition by fio, datediff(day,0,t.Data)/7, task) [Сумма загрузки по неделям]
, sum(IsWork) over (partition by fio, datediff(day,0,t.Data)/7, task) [Раб.дни]
, (nullif(work,0) / work) *
(sum(work) over (partition by fio, datediff(day,0,t.Data)/7, task) / sum(IsWork) over (partition by fio, datediff(day,0,t.Data)/7, task)) [Загрузка/Раб.дни]
from @t t
inner join @calendar c on t.data = c.data
order by 1,2




...
Рейтинг: 0 / 0
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / RS2005 Среднее за неделю / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]