【问题标题】:How to query cumulative sum period by month如何按月查询累计和期间
【发布时间】:2021-12-28 07:44:44
【问题描述】:

我对这样的表源有疑问:

表格中的可用月份仅来自列月份,没有 4 月、5 月、6 月等。

我需要创建一个视图来创建“年初至今”表,如下所示:

我需要查看 2020 年 1 月至 12 月的所有月份,其值基于表源。

VALUE COLUMN 由 Source 填写同月,但由于 April 无法从源获得,所以它自动设置为 0,其他相同

对于 CUMULATIVE VALUE COLUMN,由上个月值的总和填充

我尝试过在查询时使用大小写,但如果我有很多名称而不是动态的,那就不简单了

【问题讨论】:

  • 查看获取日历表;它们是宝贵的资源。那么每月获得一排的问题就不像JOIN那么简单。至于累积的SUM,自 SQL Server 2012 起就已支持。您将了解如何通过快速搜索来实现。
  • @Larnu 当我使用年和月加入带有日历表的表时,视图只显示存在的月份
  • 你需要LEFT JOIN,而不是INNER JOIN。

标签: sql sql-server cumulative-sum


【解决方案1】:

你可以使用下一个 SQL 构造:

 WITH Calendar AS (
    -- generate Year, Month table for each Name
    SELECT Year, Month, Name
    FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) AS Months(Month)
    CROSS JOIN (VALUES (2020)) AS years(Year)
    CROSS JOIN (SELECT DISTINCT Name FROM Source) AS Names
) SELECT 
    Calendar.Year,
    Calendar.Month,
    Calendar.Name, 
    COALESCE(Source.Value, 0) AS Value,
    SUM(COALESCE(Source.Value, 0)) OVER(PARTITION BY Calendar.Name ORDER BY Calendar.Year, Calendar.Month) AS cumulativeSum
FROM Calendar
LEFT JOIN Source ON 
    Source.Year = Calendar.Year AND 
    Source.Month = Calendar.Month AND
    Source.Name = Calendar.Name ;

MSSQL cumulative sum

查询使用 CTE 表达式生成日历表和窗口函数 SUM 按名称分区计算累积值

【讨论】:

  • 如果我有很多年,例如 2010-2020 列年份,我应该申报吗?还是使用桌子?
  • 我知道如何创建动态年份,我需要将列声明为不同的表源
  • 很好的查询@Slava,我需要修改真实数据表。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多