sql - 从12月到12月获得AVG SQL

标签 sql sql-server tsql join sql-update

我有此表(示例):

http://www.sqlfiddle.com/#!9/412b11/1

并且我需要在基于年份的AnualAmount列中插入全年平均值+去年12月的平均值,这是我必须使用示例数据获得的结果:

Example Result

因此,在2018年的所有期间中,我都必须在AnualAmount中插入全年的AVG +去年12月的金额,以此类推。

最佳答案

有点笨拙,但我认为它可行

declare @T table (Period int, Coin varchar(3), Amount int, AnualAmount varchar(4));
INSERT INTO @T (Period, Coin, Amount, AnualAmount) VALUES
    (201701, 'MXP', 13.5, NULL),
    (201702, 'MXP', 14.5, NULL),
    (201703, 'MXP', 15.5, NULL),
    (201704, 'MXP', 16.5, NULL),
    (201705, 'MXP', 17.5, NULL),
    (201706, 'MXP', 18.5, NULL),
    (201707, 'MXP', 19.5, NULL),
    (201708, 'MXP', 20.5, NULL),
    (201709, 'MXP', 21.5, NULL),
    (201710, 'MXP', 22.5, NULL),
    (201711, 'MXP', 23.5, NULL),
    (201712, 'MXP', 24.5, NULL),
    (201801, 'MXP', 25.5, NULL),
    (201802, 'MXP', 26.5, NULL),
    (201803, 'MXP', 27.5, NULL),
    (201804, 'MXP', 28.5, NULL),
    (201805, 'MXP', 29.5, NULL),
    (201806, 'MXP', 30.5, NULL),
    (201807, 'MXP', 31.5, NULL),
    (201808, 'MXP', 32.5, NULL),
    (201809, 'MXP', 33.5, NULL),
    (201810, 'MXP', 34.5, NULL),
    (201811, 'MXP', 35.5, NULL),
    (201812, 'MXP', 36.5, NULL),
    (201701, 'COP', 37.5, NULL),
    (201702, 'COP', 38.5, NULL),
    (201703, 'COP', 39.5, NULL),
    (201704, 'COP', 40.5, NULL),
    (201705, 'COP', 41.5, NULL),
    (201706, 'COP', 42.5, NULL),
    (201707, 'COP', 43.5, NULL),
    (201708, 'COP', 44.5, NULL),
    (201709, 'COP', 45.5, NULL),
    (201710, 'COP', 46.5, NULL),
    (201711, 'COP', 47.5, NULL),
    (201712, 'COP', 48.5, NULL),
    (201801, 'COP', 49.5, NULL),
    (201802, 'COP', 50.5, NULL),
    (201803, 'COP', 51.5, NULL),
    (201804, 'COP', 52.5, NULL),
    (201805, 'COP', 53.5, NULL),
    (201806, 'COP', 54.5, NULL),
    (201807, 'COP', 55.5, NULL),
    (201808, 'COP', 56.5, NULL),
    (201809, 'COP', 57.5, NULL),
    (201810, 'COP', 58.5, NULL),
    (201811, 'COP', 59.5, NULL),
    (201812, 'COP', 60.5, NULL),
    (201701, 'REA', 61.5, NULL),
    (201702, 'REA', 62.5, NULL),
    (201703, 'REA', 63.5, NULL),
    (201704, 'REA', 64.5, NULL),
    (201705, 'REA', 65.5, NULL),
    (201706, 'REA', 66.5, NULL),
    (201707, 'REA', 67.5, NULL),
    (201708, 'REA', 68.5, NULL),
    (201709, 'REA', 69.5, NULL),
    (201710, 'REA', 70.5, NULL),
    (201711, 'REA', 71.5, NULL),
    (201712, 'REA', 72.5, NULL),
    (201801, 'REA', 73.5, NULL),
    (201802, 'REA', 74.5, NULL),
    (201803, 'REA', 75.5, NULL),
    (201804, 'REA', 76.5, NULL),
    (201805, 'REA', 77.5, NULL),
    (201806, 'REA', 78.5, NULL),
    (201807, 'REA', 79.5, NULL),
    (201808, 'REA', 80.5, NULL),
    (201809, 'REA', 81.5, NULL),
    (201810, 'REA', 82.5, NULL),
    (201811, 'REA', 83.5, NULL),
    (201812, 'REA', 84.5, NULL);
declare @D table (Period int);
INSERT INTO @D (Period) values
    (201712),
    (201801),
    (201802),
    (201803),
    (201804),
    (201805),
    (201806),
    (201807),
    (201808),
    (201809),
    (201810),
    (201811),
    (201812);
select t.Coin, t.Period, t.Amount 
     , AVG(t.Amount) over (partition by t.Coin) as Annual     
from @T t
join @D d
on t.Period = d.Period 
union all 
select t.Coin, t.Period, t.Amount  
     , null    
from @T t
left join @D d
on t.Period = d.Period 
where d.Period is null
order by Coin, Period;

Coin Period      Amount      Annual
---- ----------- ----------- -----------
COP  201701      37          NULL
COP  201702      38          NULL
COP  201703      39          NULL
COP  201704      40          NULL
COP  201705      41          NULL
COP  201706      42          NULL
COP  201707      43          NULL
COP  201708      44          NULL
COP  201709      45          NULL
COP  201710      46          NULL
COP  201711      47          NULL
COP  201712      48          54
COP  201801      49          54
COP  201802      50          54
COP  201803      51          54
COP  201804      52          54
COP  201805      53          54
COP  201806      54          54
COP  201807      55          54
COP  201808      56          54
COP  201809      57          54
COP  201810      58          54
COP  201811      59          54
COP  201812      60          54
MXP  201701      13          NULL
MXP  201702      14          NULL
MXP  201703      15          NULL
MXP  201704      16          NULL
MXP  201705      17          NULL
MXP  201706      18          NULL
MXP  201707      19          NULL
MXP  201708      20          NULL
MXP  201709      21          NULL
MXP  201710      22          NULL
MXP  201711      23          NULL
MXP  201712      24          30
MXP  201801      25          30
MXP  201802      26          30
MXP  201803      27          30
MXP  201804      28          30
MXP  201805      29          30
MXP  201806      30          30
MXP  201807      31          30
MXP  201808      32          30
MXP  201809      33          30
MXP  201810      34          30
MXP  201811      35          30
MXP  201812      36          30
REA  201701      61          NULL
REA  201702      62          NULL
REA  201703      63          NULL
REA  201704      64          NULL
REA  201705      65          NULL
REA  201706      66          NULL
REA  201707      67          NULL
REA  201708      68          NULL
REA  201709      69          NULL
REA  201710      70          NULL
REA  201711      71          NULL
REA  201712      72          78
REA  201801      73          78
REA  201802      74          78
REA  201803      75          78
REA  201804      76          78
REA  201805      77          78
REA  201806      78          78
REA  201807      79          78
REA  201808      80          78
REA  201809      81          78
REA  201810      82          78
REA  201811      83          78
REA  201812      84          78

关于sql - 从12月到12月获得AVG SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49622368/

相关文章:

sql-server - 单个 SQL Server 命名实例上的多个数据库

sql-server - 插入触发器后 - SQL Server 2008

较小结果集的 SQL 聚合

sql - Insert 语句的创建过程出现问题。错误消息: "error near @Parameter Name"

sql - 在 Sybase ASE 中插入多行

sql-server - 选择无法转换的行

python - 使用 F 对象切换查询集中的 boolean 字段

mysql - 查询以选择具有两个精确记录的对象

sql - 如何将随机整数插入到 PostgreSQL 中的特定列

sql - Oracle SQL-在 "Distinct"查询中获取 "CASE"值