【问题标题】:Calculate SUM by date with week and month trick SQL使用星期和月份技巧 SQL 按日期计算 SUM
【发布时间】:2015-04-24 12:53:40
【问题描述】:

我想要实现的是按周计算我在邮件表中的一些统计数据

例如在表中我有这个

 '20130226',    312.00
 '20130305',    833.00

以 20130305 结束的一周在 2 月有 2 天,在 3 月有 5 天。 我正在努力实现:

2013-02-28  550.000000
2013-03-31  2285.000000

我有这个问题:

    CREATE TABLE #Old
    (
    Weeks DATE,
    summ NUMERIC (12,6)    
)
        INSERT INTO #Old VALUES  ( '20130226',  312.00)
        INSERT INTO #Old VALUES  ( '20130305',  833.00)
        INSERT INTO #Old VALUES  ( '20130312',  225.00)
        INSERT INTO #Old VALUES  ( '20130319',  453.00)
        INSERT INTO #Old VALUES  ( '20130326',  774.00) 



 SELECT  
    EOMONTH ( Weeks  )
    , sum (summ)  as cumesum
    FROM  #Old
    GROUP BY  EOMONTH ( Weeks  )

我知道这不对,因为它没有在两个月内拆分那一周,但不知道如何实现它。

【问题讨论】:

  • 您知道拆分聚合数据不会为您提供准确的结果,对吧?你还有基础数据可以使用吗?

标签: sql sql-server tsql date sum


【解决方案1】:

如果我的理解正确,您希望按月分配每周的数字。一种方法是在当前月份和上个月之间拆分数据 - 将分配作为值的算术进行。

剩下的只是聚合:

select EOMonth(weeks), sum(month_summ)
from ((select weeks, year(weeks) as yy, month(weeks) as mm,
              (case when day(weeks) >= 7 then summ
                    else summ * day(weeks) / 7.0
               end) as month_summ
       from #old o
      ) union all
      (select dateadd(month, -1, weeks) as weeks,
              year(dateadd(month, -1, weeks)) as yy,
              month(dateadd(month, -1, weeks)) as mm,
              summ * (1 - day(weeks) / 7.0)
       from #old o
       where day(weeks) < 7
      )
     )
group by EOMonth(weeks);

【讨论】:

  • 它的 T-SQL ,老实说它并不安静,因为我必须像这样将月份显示为每月的最后一天 2013-03-31
  • @Andrey。 . .这是对我刚刚所做的查询的一个非常小的更改。
  • 必须重新编写它,但可能感谢您为 MySQl 工作的示例,但这种结构不适用于 MSSQL?我通过 CTE 做到了
  • @Andrey。 . .我想我修正了错别字,但 SQL Fiddle 真的很慢而且表现得很糟糕 (sqlfiddle.com/#!6/250c6/3)。
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2015-06-20
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多