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 |
+----+------+-----------+----------+--------------+----------+----------+----------+----------+----------+