【问题标题】:Total Financial exposure per year for warranty in SQLSQL 保修每年的总财务风险
【发布时间】:2021-09-27 16:53:11
【问题描述】:

我在SQL Server 2019

我陷入了一个看似很简单的问题,但我陷入了困境。

我需要在 SQL 中创建一个视图,用于计算我们项目每年保修的总财务风险。

每个项目都有多个保修条款(但在此计算中并不重要)。我只对整个公司的财务风险感兴趣。

示例表为:

Project number Warranty term Financial exposure Warranty period start Warranty period end
Project 1 painting 1,000,000 01-Jan-2021 01-Jan-2023
Project 2 structure 500,000 15-May-2021 15-May-2031
Project 3 painting 1,000,000 25-Mar-2022 24-Mar-2042
Project 3 performance 5,000,000 25-Mar-2022 25-Mar-2030
Project 4 uptime 10,000,000 01-Jan-2023 01-Jan-2033

我正在寻找类似的东西:

Year Financial Exposure
2021 1,500,000
2022 7,500,000
2023 17,500,000
2024 16,500,000
2025 16,500,000
2026 16,500,000
2027 16,000,000
2028 16,000,000
2029 16,000,000
2030 16,000,000
2031 11,000,000
2032 11,000,000
2033 11,000,000
2034 1,000,000
2035 1,000,000
2036 1,000,000
2037 1,000,000
2038 1,000,000
2039 1,000,000
2040 1,000,000
2041 1,000,000
2042 1,000,000

非常感谢!

【问题讨论】:

    标签: sql sql-server finance


    【解决方案1】:

    您需要一个计数表。或者使用递归 cte 在查询中动态生成一个。 CROSS JOIN你的项目表到计数表


    with years as   -- the tally table
    (
         select year = min(year(period_start)), max_year = max(year(period_end))
         from   project
         union all
         select year = year + 1, max_year
         from  years
         where  year < max_year
    )
    select y.year, sum(exposure) As [Financial Exposure]
    from   project p
           cross join years y
    where  year(p.period_start) <= y.year
    and    year(p.period_end) >= y.year
    group by y.year
    

    dbfiddle demo

    【讨论】:

    • 我不是 sql 专家,我正在努力从您的解决方案中创建一个视图...您能进一步帮助我吗?再次感谢
    • 只需在查询前添加CREATE VIEW {view name} AS
    • 我太笨了……我试过了,没用……现在我又试了一次,成功了……再次感谢!!!
    • cross join... where 很傻,只需使用普通连接即可。另外,我敢说,从表中取出 minmax 年份是不值得搞砸的,只需从合理的默认值开始,比如 20202050,无论如何你都会加入
    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多