Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Server:将日历年中的月份转换为会计年度中的月份_Sql_Sql Server_Sql Server 2005_Calendar - Fatal编程技术网

Sql Server:将日历年中的月份转换为会计年度中的月份

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

我有一个独特的问题,我根本无法解决

因此,我使用的是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_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