【问题标题】:a SQL aggregation querySQL 聚合查询
【发布时间】:2009-12-17 22:49:09
【问题描述】:

我有一个包含 2 列、一个日期列和一个 int 列的表,我想对每个月从 15 日开始的 int 列求和

所以第一个结果是从今天到下个月(1 月)的 15 日,下一行是从 1 月 16 日到 2 月 15 日,依此类推,直到第一列中没有更多日期

有道理吗?

已编辑!!!

对不起,我会更好地解释我的意思。 一个月的定义是从一个月的 15 号到下个月的 14 号。 结果中的第一个月将从今天到 14 日,其中 14 日可能是一天或 3 周之后等。第二个月将是下个月的 14 日。 结果中的最后一个月是表上的15号到结束日期,所以最后一个月有可能是2天的数据

更好?

我现在看看答案

【问题讨论】:

  • 您的问题与月初的含义不一致。如果该月从 15 日开始(第一段),则该月将持续到下个月 15 日(第二段)。我的回答假设 15 日是月初,而不是月底。希望没关系。

标签: sql sql-server tsql


【解决方案1】:

因此,您希望将月份视为比十四天前晚一个月的月份。因此,从今天(12 月 17 日)开始,我们倒退 14 天到 12 月 3 日,然后再加一个月使其成为 1 月 3 日。所以今天算一月。

截断月份的常用方法是DATEADD(month, DATEDIFF(month, 0, someDate), 0)。我会使用它,但首先请假十四天,然后我会在添加月份时添加一个。

SELECT 
    DATEADD(month, 1+DATEDIFF(month, 0, DATEADD(day, -14, yourDate)),0) as theMonth, 
    SUM(yourInt) as Total
FROM yourTable
GROUP BY DATEADD(month, 1+DATEDIFF(month, 0, DATEADD(day, -14, yourDate)),0);

祝你好运......你可能更喜欢从简单的事情开始:

SELECT 
    DATEADD(month, 1+DATEDIFF(month, 0, DATEADD(day, -14, yourDate)),0) as theMonth
    , *
FROM yourTable

...这样你就可以理解月份计算的逻辑了。

【讨论】:

  • 只是一个简短的说明来解释截断方法。 12 月的每一天与特定时间点(例如,第 0 天)相距相同的月数。将该月数加回到第 0 天(即 1900 年 1 月 1 日)为您提供该日期月份的开始。在我的查询中,我说的是“添加一个额外的月份”,以便我得到下个月的开始。另外,我提前 14 天开始,因为您希望您的月份从 15 日开始。
  • 表达式 dateadd(month, datediff(month, 0, datecol-14), 0) 将始终生成午夜日期,即 14 天前日期所在月份的第一个月。 .
  • 查尔斯——是的,没错。我只是使用 DATEADD 而不是您拥有的整数操作减去 14 天。但他想要下个月,这就是为什么我要在我加回来的月数上加 1。
【解决方案2】:

如前所述,您必须按创建由日历月定义的存储桶的表达式进行分组

  Select dateadd(month, datediff(month, 0, datecol-14), 0 ) CalendarMonth, 
        sum(col) Total
  From Table
  Group By dateadd(month, datediff(month, 0, datecol-14), 0)

表达式dateadd(month, datediff(month, 0, datecol-14), 0) 将始终生成午夜日期,即 14 天前日期所在月份的第一个月...

注意:group by 表达式或表达式必须与 select 子句中非聚合函数的所有表达式相同,并包括所有表达式

编辑:此表达式按月创建存储桶,从下个月的 15 日到 14 日,但描述使用当月第一天的日期存储桶开始于。即,它生成存储桶开始所在月份的第一天的日期......例如,从 11 月 15 日到 12 月 14 日的任何日期将为您提供 11 月 1 日,从 12 月 15 日到的任何日期1 月 14 日将为您提供 12 月 1 日等。

【讨论】:

  • 嗨,Charles,这只有在您这样做时才有效:“创建由日历月份定义的存储桶”。你能改变它,让一个月从 15 日开始,到 14 日结束,就像我上面编辑的问题一样?
  • Charles - 现在你的答案得到了改进,因为你已经改变了它。您最初的答案是在本月初之前给出 14 个日期。我已经删除了我的 -1。
  • @Billy,这是在下个月的 15 日到 14 日创建存储桶。它只是在一个月的第一天描述它们......即从 11 月 15 日到 12 月 14 日的任何日期都会给你 11 月 1 日,从 12 月 15 日到 1 月 14 日的任何日期都会给你 12 月 1 日,等等......
猜你喜欢
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
相关资源
最近更新 更多