【问题标题】:SQL - Calculating YTD averages for each quarterSQL - 计算每个季度的 YTD 平均值
【发布时间】:2021-04-26 09:04:10
【问题描述】:

我正在尝试计算每个季度的 YTD 平均值。例如:

  • Q1 应该显示 Q1 数据的平均值
  • Q2 应该显示 Q1 和 Q2 数据的平均值
  • Q3 应该显示 Q1、Q2 和 Q3 的平均值
  • 第四季度应显示所有季度的平均值。

它还需要处理多年。因此,如果我的数据看起来像这样,我希望添加标记为 YTD_AVG 的最后一列

   <---   I already have these  ---->   Need this field
Date      |    YEAR_QTR  |   VALUE  |   YTD_AVG
1/1/2019        2019Q1        10          11
1/6/2019        2019Q1        5           11 
2/20/2019       2019Q1        18          11
4/10/2019       2019Q2        7           10   <-- average of Q1 and Q2
6/10/2019       2019Q2        10          10
8/11/2019       2019Q3        25          15   <-- average of Q1, Q2 and Q3
9/1/2019        2019Q3        20          15
9/20/2019       2019Q3        25          15

等等。

然后,当年份转换到 2020 年时,它需要能够知道在 2020 年第一季度重新开始。

我试图按照以下方式做一些事情:

SELECT a.*
       , YTD_QTR  = AVG(VALUE) OVER (PARTITION BY [YEAR],YEAR_QTR)
FROM(
    SELECT [DATE]
          , YEAR_QTR
          , datepart(year, COB_DATE) as [YEAR]
          , VALUE
    FROM #TABLE )  a

任何指导将不胜感激!

【问题讨论】:

  • 请向我们展示您的尝试。
  • 为什么要标记 3 个不同版本的 SQL Server?
  • 嗨@DaleK - 更新了我无法为每个 ytd 季度工作的查询尝试。我标记了不同的版本,因为我认为即使是较旧的方法在 2012 年仍然有效,我没有大量数据,所以它不需要是最新、最好和最优化的。谢谢

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

这可以通过 CROSS APPLY 运算符来完成(我认为它在 SQL Server 2012 中可用)。看到这个答案:

但是您的YEAR_QTR 列是不是错了,2019-10-20 = 第 4 季度对吗?

DECLARE @ValuesTable TABLE (
[Date] DATE,
YEAR_QTR VARCHAR(6),
[VALUE] INT
);
INSERT INTO @ValuesTable
(
    Date,
    YEAR_QTR,
    VALUE
)
SELECT '2019-01-01','2019Q1',10 UNION ALL
SELECT '2019-01-06','2019Q1',5 UNION ALL
SELECT '2019-02-20','2019Q1',18 UNION ALL
SELECT '2019-04-10','2019Q2',7 UNION ALL
SELECT '2019-06-10','2019Q2',10 UNION ALL
SELECT '2019-08-11','2019Q3',25 UNION ALL
SELECT '2019-09-01','2019Q3',20 UNION ALL
SELECT '2019-10-20','2019Q3',25 

/*
Final output
*/
SELECT
  [Date],
  DATEPART(QUARTER,Date) [Quarter],
  VT.YEAR_QTR,
  [VALUE],
  YTD_AVG.YTD_AVG
FROM @ValuesTable VT
CROSS APPLY(
  SELECT
    AVG(VT2.VALUE) YTD_AVG
  FROM @ValuesTable VT2
  WHERE 
    YEAR(VT.Date) = YEAR(VT2.Date) AND 
    DATEPART(QUARTER,VT2.Date) <= DATEPART(QUARTER,VT.Date)
)YTD_AVG

【讨论】:

  • 嗨,是的,由于拼写错误,该季度的 10/20 日期不正确,我更新了原始帖子。我会尝试一下,看看它是如何工作的,提前非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2020-10-22
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多