Автоматизированная средняя стоимость за последующие годы - PullRequest
0 голосов
/ 24 октября 2019

Я хотел бы получить некоторую помощь с кодом, я хочу получить среднюю цену за город и за год из таблицы А, в которой хранятся данные за последние три года.

 TableA

 Date       City    Price
 10/23/2018 Leon    1088
 2/27/2018  NewYork 1312
 4/19/2017  Texas   1303
 4/19/2017  London  1303
 4/19/2019  NewYork 1303
 2/12/2018  Leon    1251
 4/7/2017   Leon    1170
 3/20/2019  London  1650
 12/18/2017 Texas   1358
 2/18/2019  Leon    1088
 7/3/2017   NewYork 1391
 8/8/2019   Texas   830
 4/5/2018   London  1869.5
 1/29/2018  London  1169
 8/9/2019   Texas   1130

Средняя цена должна рассчитываться для города в год. Результаты должны быть сгруппированы по годам и показаны для каждого города следующим образом:

Result from TableA

City       Avg2017    Avg2018    Avg2019
Leon        1170      1169.5     1088
London      1303      1519.25    1650
New York    1391      1312       1303
Texas       1330.5     0         1390

Однако я хочу, чтобы он автоматически обрабатывал будущие данные, и когда наступит 2020 год, 2017 год исчезнет из результатов (и т. Д. В последующие годы).

Сценарий будет выглядеть примерно так:

 TableB

 Date       City    Price
 10/23/2018 Leon    1088
 2/27/2018  NewYork 1312
 4/19/2020  Texas   1303
 4/19/2020  London  1303
 4/19/2019  NewYork 1303
 2/12/2018  Leon    1251
 4/7/2020   Leon    1170
 3/20/2019  London  1650
 12/18/2020 Texas   1358
 2/18/2019  Leon    1088
 7/3/2020   NewYork 1391
 8/8/2019   Texas   830
 4/5/2018   London  1869.5
 1/29/2018  London  1169
 8/9/2019   Texas   1130
 4/19/2017  Texas   1303
 4/19/2017  London  1303
 4/7/2017   Leon    1170
 12/18/2017 Texas   1358
 7/3/2017   NewYork 1391

И результат без 2017 и с 2020 г.

Result from TableB

City          Avg2018    Avg2019  Avg2020
Leon          1169.5     1088     1170
London        1519.25    1650     1303
New York      1312       1303     1391
Texas         0          1390     1330.5

Моя версия SQL Server 15.0.18142

Возможно ли это?

1 Ответ

1 голос
/ 24 октября 2019

Для динамического года pivoting наш единственный вариант - использовать динамические запросы.

получение данных за последние 3 года

between dateadd(yy, -3, getdate()) and getdate()

полный запрос:

select * into #res from (
    select '10/23/2018' as d ,'Leon' City, 1088 as price
    union all
    select '2/27/2018' ,'NewYork' ,1312
    union all
    select '4/19/2017' ,'Texas' ,1303
    union all
    select '4/19/2017' ,'Leon' ,1303
    union all
    select '4/19/2019' ,'London' ,1303
    union all
    select '4/19/2019' ,'NewYork' ,2000
    union all
    select '3/19/2019' ,'NewYork' ,1000
    union all
    select '3/19/2020' ,'NewYork' ,1000
    union all
    select '3/19/2020' ,'London' ,3000
    union all
    select '3/19/2020' ,'Texas' ,1000
)res


declare  @cols nvarchar(max);
declare  @sql nvarchar(max);

select @cols =
    stuff((select N'],[Avg' + d
       from (select distinct right(d, 4) as d
          from #res where right(d, 4) between year(getdate())-1 and year(getdate())+1) AS t1   
       for xml path('')
    ), 1, 2, '') + N']';

set @sql = N'Select City, ' + @cols + N'
            from (select City, concat(''Avg'', right(d, 4)) as d, price from #res)t1 
            pivot 
            (
                avg(t1.price)
                for t1.d in (' + @cols + N')
            ) p         
            '
print @sql;
exec sp_executesql @sql;

drop table #res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...