根据开始日期和结束日期每月分配金额

Posted

技术标签:

【中文标题】根据开始日期和结束日期每月分配金额【英文标题】:Distribute amount monthly with respect to start date and end date 【发布时间】:2017-08-12 12:07:39 【问题描述】:

我有桌子

Project_ID
Start_Date
End_Date
BUDGET_Amount

例如:

我需要用 SQL 返回 12 行,每行代表两个日期之间的月份-年份,预算的值 = 1200 / 两个日期之间的月份数“12” = 100$

所以结果是这样的 Proj_ID , START_DATE , END_DATE , AMOUNT

"1","1-JAN-2017","31-JAN-2017",100$ "1","2017 年 2 月 1 日","2017 年 2 月 27 日",100 美元 "1","1-MAR-2017","31-MAR-2017",100$ "1","1-APR-2017","31-APR-2017",100$ "1","2017 年 5 月 1 日","2017 年 5 月 31 日",100 美元 "1","1-JUN-2017","31-JUN-2017",100$ "1","1-JUL-2017","31-JUL-2017",100$ "1","1-AUG-2017","31-AUG-2017",100$ "1","1-SEP-2017","31-SEP-2017",100$ "1","1-OCT-2017","31-OCT-2017",100$ "1","2017 年 11 月 1 日","2017 年 11 月 31 日",100 美元 "1","1-DEC-2017","31-DEC-2017",100$

【问题讨论】:

我删除了不兼容的数据库标签。请标记您真正使用的数据库。 . . Oracle 还是 SQL Server? 【参考方案1】:

使用公用表表达式 (CTE),您可以生成给定范围内的日期。这将生成您需要的输出:

;with mycte as
     (
    select cast('1 jan 2017' as datetime) as DateValue
    union all
    select DATEADD(MONTH,1, DateValue)
    from    mycte  
    where   DATEADD(MONTH,1, DateValue) <= '31 dec 2017'
    )

   select 
   1 Proj_ID,
   REPLACE(CONVERT(VARCHAR(11), DateValue, 106), ' ', '-')  START_DATE ,
   REPLACE(CONVERT(VARCHAR(11), DATEADD(DAY, -1, DATEADD(MONTH,1, DateValue))), ' ', '-')   END_DATE  ,
   '100$' AMOUNT
   from    mycte

这将显示月份的第一天和最后一天。

【讨论】:

它需要更加动态 需要更多解释。 PROJECT_ID START_DATE END_DATE REVENUE 30001 4/1/2016 4/1/2018 24,000 30002 4/1/2016 4/1/2018 2000 30003 1/1/2016 1/1/2017 5000跨度> @MohamedFouad,发布格式化数据。可能是截图?获得所需的输出。

以上是关于根据开始日期和结束日期每月分配金额的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL - 如何在N个月内传播X数量

根据 Pandas DataFrame 中每个项目的开始和结束日期计算每月活动的项目数

MS SQL如何根据最早的日期查询金额

SQLITE 每月使用 SUM 查询 GROUP BY

维度建模几个问题

如何用sql的日期函数,分别查出1月~12月每个月的销售金额?