sql - 如何在选择查询 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]
有什么建议或示例查询可以做到这一点吗?谢谢
解决方案
;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
...
推荐阅读
- angular - Angular 提供者:使用现有的或创建一个(如果未提供)
- androidpdfviewer - 如何在 Android Studio 中的文档(.pdf、.doc)上添加水印?
- python - 在 Python 中忽略某些用于网页抓取的标签
- c# - 如果两个对象具有所有属性值,则检查对象列表
- php - 如何在 PHP 中正确插入 div?
- pygame - NameError:名称“事件”未定义
- asynchronous - Grails 4 异步与数据库操作
- javascript - 如何知道所请求的数据集的格式、类型和组织是什么?
- python - OneHotEnoder.fit 不适用于对象(数据类型)
- ios - iOS 上支持的麦克风采样率