Sql Server:将日历年中的月份转换为会计年度中的月份
我有一个独特的问题,我根本无法解决 因此,我使用的是SQL Server 2005,我可以使用以下数据:Sql Server:将日历年中的月份转换为会计年度中的月份,sql,sql-server,sql-server-2005,calendar,Sql,Sql Server,Sql Server 2005,Calendar,我有一个独特的问题,我根本无法解决 因此,我使用的是SQL Server 2005,我可以使用以下数据: 会计年度开始月整数(会计年度的第一个月) COUNT_START_MONTH INT(我们需要开始的第一个月) 总月数 年[1-6]\u个月-这是每个日历年的月数 我需要将月份分配到6个会计年度+剩余部分 例如: FISCAL_YEAR_START_MONTH = 7 COUNT_START_MONTH = 9 TOTAL_MONTHS = 36 YEAR1_MONTHS = 4 YEAR2
FISCAL_YEAR_START_MONTH = 7
COUNT_START_MONTH = 9
TOTAL_MONTHS = 36
YEAR1_MONTHS = 4
YEAR2_MONTHS = 12
YEAR3_MONTHS = 12
YEAR4_MONTHS = 8
应该输出
YEAR1_MONTHS YEAR2_MONTHS YEAR3_MONTHS YEAR4_MONTHS YEAR5_MONTHS YEAR6_MONTHS LEFTOVER
------------ ------------ ------------ ------------ ------------ ------------ ----------
10 12 12 2 0 0 0
YEAR1_MONTHS YEAR2_MONTHS YEAR3_MONTHS YEAR4_MONTHS YEAR5_MONTHS YEAR6_MONTHS LEFTOVER
------------ ------------ ------------ ------------ ------------ ------------ ----------
2 12 0 0 0 0 0
我只是不能用sql解决这个问题。作为一个人,很容易看出月份应该在每个案例上分布,但我不能将其转化为一个算法
我试着计算每年的日期,记下我还剩多少个月,但都没有解决我的问题
任何解决方案,即使是上述示例中的特定解决方案(但理想情况下是通用解决方案),都将非常有用
编辑:修复了滚动问题,好像我收到了坏数据
EDIT2:另一个例子,一个简单的例子:
FISCAL_YEAR_START_MONTH = 7
COUNT_START_MONTH = 5
TOTAL_MONTHS = 14
YEAR1_MONTHS = 8
YEAR2_MONTHS = 6
应该输出
YEAR1_MONTHS YEAR2_MONTHS YEAR3_MONTHS YEAR4_MONTHS YEAR5_MONTHS YEAR6_MONTHS LEFTOVER
------------ ------------ ------------ ------------ ------------ ------------ ----------
10 12 12 2 0 0 0
YEAR1_MONTHS YEAR2_MONTHS YEAR3_MONTHS YEAR4_MONTHS YEAR5_MONTHS YEAR6_MONTHS LEFTOVER
------------ ------------ ------------ ------------ ------------ ------------ ----------
2 12 0 0 0 0 0
——测试表。
创建表格#CalTest(
示例编号SMALLINT标识,
财政年度开始月SMALLINT,
CountStartMonth SMALLINT,
TotalInt,
年1月SMALLINT,
年2个月SMALLINT,
年份3个月SMALLINT,
年份4个月SMALLINT,
年份5个月SMALLINT,
一年六个月,
剩下的SMALLINT,
)
去
--样本数据按照OP。
插入#CalTest(财政开始月、计数开始月、总月、年1月、年2月、年3月、年4月、年5月、年6月、剩余)
价值观
(7,9,36,4,12,12,8,0,0,0),
(7,5,14,8,6,0,0,0,0,0)
去
从#CalTest中选择*
去
创建函数guest.PickMin
--此函数只选择两个数字中较小的一个。
(
@第一个SMALLINT SMALLINT,
@第二个SMALLINT SMALLINT
)
返回SMALLINT
作为
开始
声明@RetVal SMALLINT
如果@FirstSmallInt<@SecondSmallInt
设置@RetVal=@FirstSmallInt
其他的
设置@RetVal=@SecondSmallInt
返回@RetVal
结束
去
;以CTE为例
(
--第一年的计算。
挑选
c、 例如number,c.fiscalyeartmonth,c.CountStartMonth,1作为数字,c.TotalMonths,
案例
当c.CountStartMonth>c.FiscalYearStartMonth时
客人选择时间(12-(c.CountStartMonth-c.fiscalyeartstartMonth),c.totalmonth)
其他的
c、 财政年度开始月-c.CountStartMonth
以年1个月结束,
--这些是第2年到第6年的占位符。
将(空值为SMALLINT)转换为年2个月,将(空值为SMALLINT)转换为年3个月,将(空值为SMALLINT)转换为年4个月,将(空值为SMALLINT)转换为年5个月,将(空值为SMALLINT)转换为年6个月,
--计算剩余月份。
c、 TotalMonths-guest.PickMin(
案例
当c.CountStartMonth>c.FiscalYearStartMonth时
客人选择时间(12-(c.CountStartMonth-c.fiscalyeartstartMonth),c.totalmonth)
其他的
c、 财政年度开始月-c.CountStartMonth
完,,
c、 总月份
)剩菜
从#CalTest c
联合所有
--第2年的计算
挑选
c2.ExampleNumber,c2.FiscalyeartStartMonth,c2.CountStartMonth,c2.DreamNumber+1,c2.TotalMonths,
NULL,guest.PickMin(12,c2.剩余),NULL,NULL,NULL,NULL,
c2.剩菜-客人.挑选(12,c2.剩菜)
来自CTE c2
式中c2.1=1
联合所有
--第3年的计算
挑选
c2.ExampleNumber,c2.FiscalyeartStartMonth,c2.CountStartMonth,c2.DreamNumber+1,c2.TotalMonths,
NULL,NULL,guest.PickMin(12,c2.剩余),NULL,NULL,NULL,
c2.剩菜-客人.挑选(12,c2.剩菜)
来自CTE c2
式中,c2.1=2
联合所有
--第4年的计算
挑选
c2.ExampleNumber,c2.FiscalyeartStartMonth,c2.CountStartMonth,c2.DreamNumber+1,c2.TotalMonths,
NULL,NULL,NULL,guest.PickMin(12,c2.剩余),NULL,NULL,
c2.剩菜-客人.挑选(12,c2.剩菜)
来自CTE c2
式中,c2.1编号=3
联合所有
--第5年的计算
挑选
c2.ExampleNumber,c2.FiscalyeartStartMonth,c2.CountStartMonth,c2.DreamNumber+1,c2.TotalMonths,
NULL,NULL,NULL,NULL,guest.PickMin(12,c2.Leftover),NULL,
c2.剩菜-客人.挑选(12,c2.剩菜)
来自CTE c2
式中,c2.1编号=4
联合所有
--第6年的计算
挑选
c2.ExampleNumber,c2.FiscalyeartStartMonth,c2.CountStartMonth,c2.DreamNumber+1,c2.TotalMonths,
NULL,NULL,NULL,NULL,NULL,guest.PickMin(12,c2.剩余),
c2.剩菜-客人.挑选(12,c2.剩菜)
来自CTE c2
式中,c2.1编号=5
)
挑选
--如果您不想在输出中使用下一行,请将其注释掉。
例如数字、财政开始月、计数开始月、总月、,
--这些是OP要求的输出列。
--SUM()将排除在上述CTE中用作占位符的空值。
总和(年1月)年1月,
总和(年2个月)年2个月,
总和(年3个月)年3个月,
总和(年4个月)年4个月,
总和(年5个月)年5个月,
总和(年6个月)年6个月,
最小(剩余)剩余
来自CTE
按示例编号、财政开始月、计数开始月、总月分组
按示例编号排序
--根据需要放下。
拖放函数guest.PickMin
去
选择案例
当月(getdate())小于7时,则为年(getdate())
其他年份(getdate())+1
以财政年度结束
案例
当月份(getdate())>6时,则ABS(月份(getdate())-6)
其他月份(getdate())+6
以财政月结束
我还不清楚会计年度、起始月
和计数、起始月、的意思是什么。。
select CASE
WHEN month( getdate() ) < 7 then year( getdate())
ELSE year( getdate() ) + 1
END as FY
, CASE
WHEN month( getdate() ) > 6 then ABS(MONTH(getdate())-6)
ELSE MONTH(getdate())+6
END as Fiscal_month