如何使用sql查询解决这种情况?

如何使用sql查询解决这种情况?,sql,Sql,我有一张有价值观的表格 bill_amt days month 250 28 Feb 300 31 mar 500 30 apr. 我的债务总额是700英镑 现在的问题是,我需要加上账单才能得到我的债务总额 CREATE FUNCTION GetNoOfDays ( @debt_amt DECIMAL(14, 2) ) RETURNS INT AS BEGIN

我有一张有价值观的表格

bill_amt days month
250        28  Feb
300        31  mar
500        30  apr.
我的债务总额是700英镑

现在的问题是,我需要加上账单才能得到我的债务总额

    CREATE FUNCTION GetNoOfDays  
    (    
        @debt_amt DECIMAL(14, 2) 
    ) 
    RETURNS INT  
    AS 
    BEGIN
        DECLARE @days INT = 0
        DECLARE @amt DECIMAL(14, 2)
        DECLARE @day INT
        DECLARE c1 CURSOR FOR 
        SELECT [Days], [Amount] FROM Account ORDER BY [Month] DESC

        OPEN c1

        FETCH NEXT FROM c1 
        INTO @day, @amt

        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF @debt_amt > @amt
            BEGIN
                SET @days = @days + @day
                SET @debt_amt = @debt_amt - @amt
            END
            ELSE
            BEGIN
                SET @days = @days + ROUND(@debt_amt / @amt * @day, 0)
                SET @debt_amt = 0
                BREAK
            END

            FETCH NEXT FROM c1 
            INTO @day, @amt

        END

        CLOSE c1
        DEALLOCATE c1

        RETURN @days
    END

    GO

    SELECT dbo.GetNoOfDays(700)
例: 4月->我的账单金额是500天,30天。我总共欠了700英镑。我还需要200英镑来还清债务。所以我会从游行中拿走200

但是三月有300天,31天。所以我只需要从中取出200个,只需要计算出合适的日期。Ex:(200/300*31)-这将为我提供,金额为200的三月份天数

现在我需要将4月份的总天数和3月份新发现的天数相加,得到我的总天数


如何为此编写代码

使用函数找到下面的解决方案,以获得偿还债务金额的天数

    CREATE FUNCTION GetNoOfDays  
    (    
        @debt_amt DECIMAL(14, 2) 
    ) 
    RETURNS INT  
    AS 
    BEGIN
        DECLARE @days INT = 0
        DECLARE @amt DECIMAL(14, 2)
        DECLARE @day INT
        DECLARE c1 CURSOR FOR 
        SELECT [Days], [Amount] FROM Account ORDER BY [Month] DESC

        OPEN c1

        FETCH NEXT FROM c1 
        INTO @day, @amt

        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF @debt_amt > @amt
            BEGIN
                SET @days = @days + @day
                SET @debt_amt = @debt_amt - @amt
            END
            ELSE
            BEGIN
                SET @days = @days + ROUND(@debt_amt / @amt * @day, 0)
                SET @debt_amt = 0
                BREAK
            END

            FETCH NEXT FROM c1 
            INTO @day, @amt

        END

        CLOSE c1
        DEALLOCATE c1

        RETURN @days
    END

    GO

    SELECT dbo.GetNoOfDays(700)
注意:请根据您的环境替换表名。我假设Month列存储数字月份值,如2、3、4等,并按desc顺序对其进行排序。对于年度数据,您应该存储诸如201202、201203、201204等值。

尝试以下方法:

DECLARE @Debt AS DECIMAL
DECLARE @Days AS DECIMAL
DECLARE @Amount AS DECIMAL
DECLARE @TotalDays AS DECIMAL
SET @TotalDays = 0

SET @Debt = 700

DECLARE MyCursor CURSOR FOR 
    SELECT [Days], Amount FROM Test
    OPEN MyCursor
    FETCH NEXT FROM MyCursor INTO @Days, @Amount
    WHILE (@@Fetch_Status = 0 AND @Debt > 0)
    BEGIN
        IF(@Debt > @Amount)
            SET @TotalDays = @TotalDays + @Days
        ELSE
            SET @TotalDays = @TotalDays + (@Days * @Debt/@Amount)

        SET @Debt = @Debt - @Amount

        FETCH NEXT FROM MyCursor INTO @Days, @Amount
    END

    CLOSE MyCursor
    DEALLOCATE MyCursor

SELECT @TotalDays

显示您所做的工作,以便我们提供帮助。在更新查询之后,您希望您的数据是什么样的?250年2月28日100年3月10日700年5月1日或250年2月28日100年3月10日0年5月1日我给出了一个自联接以获取金额(账单金额),但后来使用了反向引用。是否可以在sql中以较低的复杂性执行此过程?@Nitesh:我不想更新。。我只想找出我还清债务的天数,你可以使用函数或SP获得结果吗?嗨,prasanna,谢谢你的代码。。我有一个疑问,“获取下一个”部分在获得4月份的价值后,如何为我带来3月份的价值?代码必须检查上个月的值,即4月->3月->2月->janIn选择光标声明,使用ORDER BY根据需要对记录进行排序。