Рассчитать среднее с запросом sql - PullRequest
0 голосов
/ 04 июля 2018

Я хочу узнать среднюю почасовую заработную плату каждого пользователя за месяц март 2018. Я хочу рассчитать это с помощью SQL-запроса.

У меня есть такие данные:

enter image description here

Дата начала показывает, когда начинается почасовая заработная плата, и когда существует новая дата начала, к которой применяется почасовая заработная плата и т. Д.

Результат должен быть:

2 €10,65
4 €9,90

Как я могу сделать это в SQL?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Приведенный ниже запрос группирует все записи для каждого userid, а затем вычисляет среднее значение. Для группировки мы использовали предложение group by.

Кроме того, функция MONTH возвращает целое число, представляющее месяц указанной даты. Так как вас интересует март, мы сравниваем это с 3.

Select UserId, avg(HourlyWage) 
from <<table>>
where month(StartDate) = 3
group by UserId

Пожалуйста, не забудьте заменить <<table>> на фактическое имя таблицы.

0 голосов
/ 04 июля 2018

Попробуйте запрос ниже. Создание таблицы календаря и затем cte для добавления отсутствующих данных для отсутствующих дат. как только у нас будут данные о пропущенных датах, будет работать простой фильтр в предложении WHERE и GROUPBY.

IF OBJECT_ID ('tempdb..#temp') IS NOT NULL
DROP TABLE #temp

IF OBJECT_ID('tempdb..#calendar') IS NOT NULL
    DROP TABLE #calendar;

CREATE TABLE #temp
(
UserId INT,
StartDate DATE,
HourlyWage decimal(10,2)
)

DECLARE @date DATE = '20180305'
INSERT INTO #temp VALUES 
(2,'20180205', 10.3),
(2,@date, 10.3),
(2,DATEADD(DAY,1,@date), 10.3),
(2,DATEADD(DAY,2,@date), 10.3),
(2,DATEADD(DAY,3,@date), 10.3),
(2,DATEADD(DAY,4,@date), 10.3),
(2,DATEADD(DAY,5,@date), 10.3),
(2,DATEADD(DAY,6,@date), 10.3),
(2,DATEADD(DAY,7,@date), 10.3),
(2,DATEADD(DAY,8,@date), 10.3),
(2,DATEADD(DAY,9,@date), 10.3),
(2,DATEADD(DAY,10,@date), 10.3),
(2,DATEADD(DAY,11,@date), 10.3),
(2,DATEADD(DAY,12,@date), 10.3),
(2,DATEADD(DAY,13,@date), 10.3),
(2,DATEADD(DAY,14,@date), 10.3),
(2,DATEADD(DAY,15,@date), 10.3),
(2,DATEADD(DAY,16,@date), 10.3),
(2,DATEADD(DAY,17,@date), 10.3),
(2,DATEADD(DAY,18,@date), 10.3),
(2,DATEADD(DAY,19,@date), 10.3),
(2,DATEADD(DAY,20,@date), 10.3),
(2,DATEADD(DAY,21,@date), 10.3),
(2,DATEADD(DAY,22,@date), 12.5),
(2,DATEADD(DAY,23,@date), 12.5),
(2,DATEADD(DAY,24,@date), 12.5),
(2,DATEADD(DAY,25,@date), 12.5),
(2,DATEADD(DAY,26,@date), 12.5),
(4,'20170221', 9.5),
(4,'20170301', 9.7),
(4,'20180227', 9.9)

DECLARE @FromDate DATETIME ,
        @ToDate DATETIME;

SELECT @FromDate = MIN(StartDate) ,
       @ToDate = MAX(StartDate)
FROM   #Temp;


SELECT   TOP ( DATEDIFF(day, @FromDate, @ToDate) + 1 ) calendarDate = CAST(DATEADD(
                                                                                 DAY ,
                                                                                 number ,
                                                                                 @FromDate) AS DATE) 
INTO     #calendar
FROM     [master].dbo.spt_values
WHERE    [type] = N'P'
ORDER BY number;

;WITH tempCTE
AS ( SELECT  DISTINCT t.userid ,
                      cal.calendarDate
     FROM    (   SELECT   calendarDate
                 FROM     #calendar c
                 ) cal
             CROSS JOIN (   SELECT UserId ,
                                   MIN(StartDate) OVER ( PARTITION BY UserId ) AS Mindate ,
                                   MAX(StartDate) OVER ( PARTITION BY UserId ) AS Maxdate 
                            FROM   #Temp ) t
     WHERE   cal.calendarDate
     BETWEEN t.Mindate AND t.Maxdate )

         SELECT   cal.UserId ,
         AVG(x.HourlyWage ) AS Avg_Wage
FROM     tempCTE cal
         CROSS APPLY (   SELECT   TOP 1 t.HourlyWage
                         FROM     #Temp t
                         WHERE    t.UserId = cal.UserId
                                  AND t.StartDate <= cal.calendarDate
                         ORDER BY t.StartDate DESC ) AS x
WHERE CalendarDate BETWEEN '20180301' AND '20180331' --your date filter here
GROUP BY cal.UserId

Результат:

+--------+-----------+
| UserId | Avg_Wage  |
+--------+-----------+
|      2 | 10.654838 |
+--------+-----------+
...