sql - 将值平均分成 12 个连续的月份 (SQL Server)
问题描述
我试图将价值平均分配到接下来的连续 12 个月。以下是我目前拥有的,接下来是我想要实现的目标。如果有人可以帮忙解决这个问题,将不胜感激。谢谢!
Type Year January February March April May June July August September October November December
Saving 2019 $1,740,000 - - - - - - - - - - -
REBATE 2018 - - - - - - - - $1,640,000 - - -
REBATE 2019 - - - $12,869 - - - - - - - -
==================================================== ==========
Request_Name Type Year January February March April May June July August September October November December
Microsoft Saving 2019 $145,000 $145,000 $145,000 $145,000 $145,000 $145,000 $145,000 $145,000 $145,000 $145,000 $145,000 $145,000
Apple REBATE 2018 - - - - - - - - $136,667 $136,667 $136,667 $136,667
Apple REBATE 2019 $136,667 $136,667 $136,667 $136,667 $136,667 $136,667 $136,667 $136,667 - - -
Sony REBATE 2019 - - - $1,072 $1,072 $1,072 $1,072 $1,072 $1,072 $1,072 $1,072 $1,072
Sony REBATE 2020 $1,072 $1,072 $1,072 - - - - - - - - -
这是我目前拥有的代码 -
/****** Script for SelectTopNRows command from SSMS ******/
SELECT *
FROM (
SELECT TASK_ID,
datename(month, [START_DATE]) 'Month',
[INITIATIVE_TYPE],
DATEpart(year, [START_DATE]) 'Year',
sum([TOTAL_SAVINGS]) TotalSavings
FROM [PRIME].[dbo].[SAV_FORM_DATA]
GROUP BY
TASK_ID,
CATEGORY ,
[INITIATIVE_TYPE],
[START_DATE]
) tbl
PIVOT
(SUM(totalsavings)
FOR [Month] IN ( [January] ,[February] ,[March] ,[April] ,
[May] ,[June] ,[July] ,[August] ,[September],
[October] ,[November] ,[December])) M
解决方案
考虑一个递归查询以迭代地将一个月添加到当前日期直到下一年。然后每个月的行将总储蓄除以 12。
以下是未经测试的 SQL 调整,需要您进一步完善。但是,请参阅Rextester 演示,演示该过程的工作原理。
WITH agg AS (
SELECT TASK_ID,
[INITIATIVE_TYPE],
[START_DATE],
SUM([TOTAL_SAVINGS]) AS TotalSavings
FROM [PRIME].[dbo].[SAV_FORM_DATA]
GROUP BY
TASK_ID,
[INITIATIVE_TYPE],
[START_DATE]
),
dates AS (
SELECT agg.TASK_ID,
agg.[INITIATIVE_TYPE],
agg.[START_DATE] AS rec_date,
agg.TotalSavings / 12 as TotalMonthSavings
FROM agg
UNION ALL
SELECT agg.mytype,
agg.[INITIATIVE_TYPE],
DATEADD(MONTH, 1, rec_date),
agg.TotalSavings / 12
FROM dates
INNER JOIN agg
ON agg.TASK_ID = dates.TASK_ID
AND agg.[INITIATIVE_TYPE] = dates.[INITIATIVE_TYPE]
AND dates.rec_date < DATEADD(MONTH, 11, agg.[START_DATE])
)
SELECT *
FROM (
SELECT TASK_ID,
[INITIATIVE_TYPE],
DATEPART(YEAR, rec_date) AS [Year],
DATENAME(MONTH, rec_date) AS [Month],
TotalMonthSavings
FROM dates
) tbl
PIVOT
(SUM(TotalMonthSavings)
FOR [Month] IN ([January], [February], [March], [April],
[May], [June], [July], [August], [September],
[October], [November], [December])
) M
ORDER BY TASK_ID,
[INITIATIVE_TYPE],
[Year]
推荐阅读
- python - 如何在python中检查网站是打开还是关闭
- xamarin.forms - Xamarin 表单上的 MSAL 和缓存访问令牌
- javascript - 如何在 C# 或 JavaScript 的输入日期类型中仅启用当前日期
- cdap - 在视图目录中查找视图“cdap”失败 -- cdap_assets login_assets
- jmeter - jmeter:即使通过了所有必填字段,服务器响应代码也是 400
- c# - 如何确保该函数只触发一次(RawInputEventArg)
- ios - 即使只有其他用户点击个人资料,也只有我的个人资料可见
- java - 切换类型时应该抛出哪个异常?
- r - 如何在 Shiny 中显示通过 fileInput 上传的视频?
- python - Discord.py 新成员消息