首页 > 解决方案 > 如何在选择查询 SQL 中循环

问题描述

嗨,我有这样的表

ICN         StartContract           EndContract             ContractValue   PeriodOfContract
A           2019-12-31 17:00:00.000  2020-03-30 17:00:00.000    19546194.00     3.00
B           2019-12-31 17:00:00.000  2020-12-30 17:00:00.000    1397095800.00   12.00
C           2021-02-28 17:00:00.000  2022-02-27 17:00:00.000    4016244584.00   12.00
D           2018-05-27 17:00:00.000  2021-05-30 17:00:00.000    9686992857.00   36.00

我想创建一个视图来循环合同期间并在我的视图中创建一个新行。示例结果

ICN Date        Amount
A   2019-12-31  6,515,398
A   2020-01-31  6,515,398
A   2020-02-29  6,515,398

我看过一些循环示例,但大多数情况下它仅用于函数。我想循环合同的期限并根据我的视图上的期限填充一个新行。这是我的查询

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT
ICN, StartContract , EndContract, ContractValue, PeriodOfContract
  FROM [FactProject]

有什么建议或示例查询可以做到这一点吗?谢谢

标签: sqlsql-server

解决方案


;WITH n(n) AS
(
    SELECT 0
    UNION ALL
    SELECT n+1 FROM n WHERE n+1 < 100
)
SELECT ICN, C.[Date], C.Amount FROM T
CROSS APPLY
(
    SELECT 
        CAST(DATEADD(MONTH, n, StartContract) AS date) [Date],
        CAST(ROUND(ContractValue / PeriodOfContract, 0) AS int) Amount  
    FROM n 
    WHERE
        n.n < T.PeriodOfContract
) C
ORDER BY ICN, [Date]

我曾经WITH n(n)生成一个 int 数字列表(在此处解释)。100注意:如果PeriodOfContract值可能超过 100,则应增加数字。

输出:

ICN Date         Amount
A   2019-12-31   6515398
A   2020-01-31   6515398
A   2020-02-29   6515398
B   2019-12-31   116424650
B   2020-01-31   116424650
...

推荐阅读