Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Накопительный итог для агрегатной функции / 7 сообщений из 7, страница 1 из 1
20.05.2019, 09:08
    #39815212
AlexandrAVG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительный итог для агрегатной функции
Доброго времени суток. Опишу проблему.
Есть таблица столбцами [modify_date], [response_1], [response_2], [response_3],[incident_id].
Таблица отображает дату опроса, оценки поставленные по 3 критериям и номер заявки по которой были поставлены оценки.
modify_date - дата опроса
response_1-3 - оценки
incident_id - номер заявки.

Задача состоит в следующем:
1. Посчитать среднее значение всех оценок по неделям за квартал.
2. Вывести историю изменения оценок по неделям за квартал.
Например, имеем средние оценки за:
первую неделю квартала: 4.3
вторую неделю квартала: 5
третью неделю квартала: 3.2
Тогда должен получится результат
первая неделя квартала: 4.3
вторая неделя квартала: 4.65 ((4.3+5)/2))
третья неделя квартала: 4.16 ((4.3+5+3.2)/3));

Вывел номер недели и номер месяца, так же вывел общую среднюю оценку из 3 столбцов.

SELECT TOP (500) concat (datepart (ww, surv_req.modify_date) , ',',MONTH (surv_req.modify_date)) as [Неделя/Месяц],
(avg (surv_req.response_1*1.00)+avg (surv_req.response_2*1.00)+avg (surv_req.response_3*1.00))/3 as 'Оценка'
FROM surv_req INNER JOIN
incident ON surv_req.incident_id = incident.incident_id INNER JOIN
assyst_usr ON incident.inc_resolve_usr = assyst_usr.assyst_usr_id
where response_1 <>'0' and
surv_req.modify_date between (select dateadd(qq, datediff(qq, 0, GETDATE()), 0)) and GETDATE() and concat(datepart(ww, surv_req.modify_date) , ',',MONTH(surv_req.modify_date))=concat(datepart(ww, surv_req.modify_date) , ',',MONTH(surv_req.modify_date))
GROUP BY month(surv_req.modify_date),datepart(ww, surv_req.modify_date)



У меня такие вопросы: как мне вывести накопительный итог для агрегатной функции avg? Накопительный итог складывает значения, как мне потом разделить полученной число на количество записей?
...
Рейтинг: 0 / 0
20.05.2019, 09:24
    #39815215
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительный итог для агрегатной функции
AlexandrAVGНапример, имеем средние оценки за:
первую неделю квартала: 4.3
вторую неделю квартала: 5
третью неделю квартала: 3.2
Тогда должен получится результат
первая неделя квартала: 4.3
вторая неделя квартала: 4.65 ((4.3+5)/2))
третья неделя квартала: 4.16 ((4.3+5+3.2)/3));В CTE посчитать среднее. В основном запросе посчитать среднее среднего как оконную функцию.
...
Рейтинг: 0 / 0
20.05.2019, 10:02
    #39815230
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительный итог для агрегатной функции
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare @t table (modify_date date, response_1 int, response_2 int, response_3 int, incident_id int);

insert into @t
values
 ('20190101', 1, 2, 3, 1),
 ('20190102', 2, 1, 2, 2),
 ('20190401', 3, 3, 3, 3),
 ('20190402', 1, 2, 2, 4);

select
 year(a.modify_date), datepart(qq, a.modify_date),
 sum(b.sum_response) / (count(*) * 3.),
 avg(sum(b.sum_response) / (count(*) * 3.)) over (order by year(a.modify_date), datepart(qq, a.modify_date))
from
 @t a cross apply
 (select a.response_1 + a.response_2 + a.response_3) b(sum_response)
group by
 year(a.modify_date), datepart(qq, a.modify_date)
order by
 year(a.modify_date), datepart(qq, a.modify_date);
...
Рейтинг: 0 / 0
20.05.2019, 11:27
    #39815267
AlexandrAVG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительный итог для агрегатной функции
invm
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare @t table (modify_date date, response_1 int, response_2 int, response_3 int, incident_id int);

insert into @t
values
 ('20190101', 1, 2, 3, 1),
 ('20190102', 2, 1, 2, 2),
 ('20190401', 3, 3, 3, 3),
 ('20190402', 1, 2, 2, 4);

select
 year(a.modify_date), datepart(qq, a.modify_date),
 sum(b.sum_response) / (count(*) * 3.),
 avg(sum(b.sum_response) / (count(*) * 3.)) over (order by year(a.modify_date), datepart(qq, a.modify_date))
from
 @t a cross apply
 (select a.response_1 + a.response_2 + a.response_3) b(sum_response)
group by
 year(a.modify_date), datepart(qq, a.modify_date)
order by
 year(a.modify_date), datepart(qq, a.modify_date);



Спасибо большое!

Теперь пытаюсь привести результат в формат 4,93, сейчас он в таком виде 4.9300000000000. Пытался воспользоваться SUBSTRING и CONVERT выдает ошибки
Argument data type numeric is invalid for argument 1 of substring function.
Arithmetic overflow error converting numeric to data type varchar.
как можно преобразовать в char, ограничить количество символов до сотрых и произвести замену с точки на запятую?
...
Рейтинг: 0 / 0
20.05.2019, 11:34
    #39815269
AlexandrAVG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительный итог для агрегатной функции
round( avg(sum(b.sum_response) / (count(*) * 3.)) over (order by month(surv_req.modify_date),datepart(ww, surv_req.modify_date)),2) as 'Оценка'

всё что смог - это округлить значения до сотых
...
Рейтинг: 0 / 0
20.05.2019, 11:36
    #39815271
AlexandrAVG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительный итог для агрегатной функции
Код: sql
1.
round( avg(sum(b.sum_response) / (count(*) * 3.)) over (order by  month(surv_req.modify_date),datepart(ww, surv_req.modify_date)),2) as 'Оценка'



так будет понятней
...
Рейтинг: 0 / 0
20.05.2019, 11:47
    #39815276
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительный итог для агрегатной функции
AlexandrAVGТеперь пытаюсь привести результат в формат 4,93На клиенте такие вещи нужно делать.
Но если очень хочется, то:
Код: sql
1.
replace(cast(cast(avg(sum(b.sum_response) / (count(*) * 3.)) over (order by year(a.modify_date), datepart(qq, a.modify_date)) as numeric(18,2)) as varchar(30)), '.', ',')
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Накопительный итог для агрегатной функции / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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