Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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-计算增加百分比?_Sql_Sql Server_Sql Server 2016 - Fatal编程技术网

SQL-计算增加百分比?

SQL-计算增加百分比?,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我的数据如下所示 ID Name Startdate Fee Increase IncreaseDate 23 PEN 01/08/2018 £65 Yes 01/12/2018 33 PEL 02/06/2018 £100 No NULL 我需要生成一个输出,显示每行的“费用”,按年份细分(需要一直到2019年) 如果“增加”标志设置为“是”,则从“增加

我的数据如下所示

ID  Name     Startdate     Fee     Increase     IncreaseDate 
23  PEN      01/08/2018    £65       Yes          01/12/2018 
33  PEL      02/06/2018    £100      No              NULL
我需要生成一个输出,显示每行的“费用”,按年份细分(需要一直到2019年)

如果“增加”标志设置为“是”,则从“增加日期”开始,费用栏将增加7%。在每个“增加日期”的周年纪念日,费用将增加7%。理想的输出如下所示,年份列为字符串格式

ID  Name     Startdate     2018                          2019  
23  PEN      01/08/2018    £65, £69.55 from 01/12/2018   £69.55, £74.41 from 01/12/2019 
33  PEL      02/06/2018    £100                          £100  
有人能帮助我们找到实现这一目标的最佳方法吗?多谢各位

使用sql server 2016


杰斯

这就是开始。它将取消2019年至2022年期间的所有费用增长。它确实假设满足
增加='Yes'
的任何记录在规定范围内每年都会增加

    SELECT 
    INTO #temp 
            ID 
        ,   Name
        ,   Startdate 
        ,   Fee As [BaseFee]
        ,   to_char(IncreaseDate, 'mon-dd') as [IncreaseDate]
        ,   Fee * (1.07) AS [Fee2018] 
        ,   Fee * POWER(1.07,2) AS [Fee2019] 
        ,   Fee * POWER(1.07,3) AS [Fee2020] 
        ,   Fee * POWER(1.07,4) AS [Fee2021]
        ,   Fee * POWER(1.07,5) AS [Fee2022]
    FROM {table_name} AS t 
    WHERE t.Increase = 'Yes';


    SELECT 
            ID 
        ,   Name 
        ,   Startdate 
        ,   CAST(BaseFee AS VARCHAR) + ', ' + CAST([Fee2018] AS VARCHAR) + ' from ' + CAST(IncreaseDate AS VARCHAR) AS [2018]
        ,   CAST([Fee2018] AS VARCHAR) + ', ' + CAST([Fee2019] AS VARCHAR) + ' from ' + CAST(DATEADD(year, 1, IncreaseDate) AS VARCHAR) AS [2019]
        ,   CAST([Fee2019] AS VARCHAR) + ', ' + CAST([Fee2020] AS VARCHAR) + ' from ' + CAST(DATEADD(year, 2, IncreaseDate) AS VARCHAR) AS [2020]
        ,   CAST([Fee2020] AS VARCHAR) + ', ' + CAST([Fee2021] AS VARCHAR) + ' from ' + CAST(DATEADD(year, 3, IncreaseDate) AS VARCHAR) AS [2021]
        ,   CAST([Fee2021] AS VARCHAR) + ', ' + CAST([Fee2022] AS VARCHAR) + ' from ' + CAST(DATEADD(year, 4, IncreaseDate) AS VARCHAR) AS [2022]
    FROM #temp;
Drop #temp;
需要额外的逻辑来检查
[IncreaseDate]
,然后相应地调整年产量


2018年所有记录的费用都会增加吗?

我可能会这样做:

设置(CTE对于您来说不是必需的,但用于我方的测试):

查询:


祝你好运。

哪一版本的SQL Server?对不起,实际上应该是7%是的。使用sql server 2016。此外,您还应拆分列…[2018年费用]£65,[2018年费用增加]£4.55,[2018年费用增加日期]2018年1月12日。你不想把它们都放在一个领域里。多少年后?每年固定百分比的增长?到2022年将是有用的,是的,固定百分比他非常感谢这一点,这是一个很大的帮助。我还有一个问题——如果增长不是每年都发生,而是在一段动态的时间后发生,我该怎么办。例如,在上面的示例中,ID23将有一个名为Months的附加列,该列将填充60。我怎样才能在60个月后申请加薪?谢谢Jess@jd8766在查询的当前状态下,没有真正简单的方法来调整内容。相反,就这个问题问另一个问题可能是有益的。但是,如果您非常想处理我编写的查询,您可以尝试编辑
年份
CTE,从
+1
移动到
+5
,这将处理60个月的变化。问题是您还需要更改
@FinalDate
参考(年>月和3>60)。但是,如果您想动态地处理它,那么更改将太大,无法在没有其他问题的情况下真正解释。
DECLARE @SQL VARCHAR(MAX)
DECLARE @YearCounter INT = Year(GetDate())
DECLARE @FinalDate INT = Year(DateAdd(year, 3, GetDate()))

;WITH CTE (ID, Name, StartDate, Fee, Increase, IncreaseDate) AS (
    SELECT * FROM (
        VALUES
            ('23','PEN','1/8/2018',65,'Yes', '01/12/2018'), 
            ('33','PEL','2/6/2018',100,'No', Null)
    ) AS A (Column1, Column2, Column3, Column4, Column5, Column6)
)
SELECT * INTO #TEMP001
FROM CTE 

SELECT 
@SQL = 'SELECT ID,
    Name, 
    StartDate, 
    Fee as Orig_Fee, 
    IncreaseDate, '

;WITH years (years, interest) AS
   (SELECT @YearCounter AS years,
    CAST('(Fee*1.07)' AS VARCHAR(MAX)) AS interest
    UNION ALL
    SELECT years + 1 AS years, 
        interest + ' * ' + '(1.07)' AS interest
    FROM years
    WHERE years.years <= @FinalDate)

SELECT 
@SQL = @SQL + 
    'CASE 
        WHEN Increase = ''Yes'' THEN 
            CAST(ROUND(' + CONVERT(VARCHAR(MAX), interest) + ', 2, 1) AS DECIMAL(38, 2)) 
        ELSE Fee
    END AS [Fee_' + CONVERT(VARCHAR(4), years) + '], '
FROM years

SELECT
@SQL = LEFT(@SQL, LEN(@SQL)-1) + '
FROM #TEMP001 '

EXEC (@SQL)

DROP TABLE #TEMP001
+----+------+-----------+----------+--------------+----------+----------+----------+----------+----------+
| ID | Name | StartDate | Orig_Fee | IncreaseDate | Fee_2018 | Fee_2019 | Fee_2020 | Fee_2021 | Fee_2022 |
+----+------+-----------+----------+--------------+----------+----------+----------+----------+----------+
| 23 | PEN  | 1/8/2018  |       65 | 01/12/2018   |    69.55 |    74.41 |    79.62 |    85.20 |    91.16 |
| 33 | PEL  | 2/6/2018  |      100 | NULL         |   100.00 |   100.00 |   100.00 |   100.00 |   100.00 |
+----+------+-----------+----------+--------------+----------+----------+----------+----------+----------+