【发布时间】:2017-06-04 09:50:49
【问题描述】:
我有这些数据:
Start End Quantity
425 449 24
450 474 24
475 499 24
500 524 24
2300 2324 24
2400 2499 99
2500 2599 99
2800 2899 99
2900 2999 99
3200 3249 49
3250 3299 49
3300 3349 49
3350 3399 49
3400 3449 49
3500 3549 49
3600 3624 24
3650 3674 24
3700 3724 24
3950 3964 14
4000 4000 0
4150 4399 249
4400 4499 99
5034 5075 41
数量是End - Start的结果。
我想获取以下数据,Generated 行:
Start End Quantity
425 449 24
450 474 24
475 499 24
500 524 24
425 524 96
2300 2324 24
2300 2324 24
2400 2499 99
2500 2599 99
-----GENERATED----
425 2599 438
------------------
2800 2899 99
2900 2999 99
3200 3249 49
3250 3299 49
3300 3349 49
3350 3399 49
3400 3449 49
3500 3549 49
-----GENERATED-----
2800 3549 492
------------------
3600 3624 24
3650 3674 24
3700 3724 24
3950 3964 14
4000 4000 0
4150 4399 249
4400 4499 99
5034 5075 41
-----GENERATED-----
3600 5075 475
------------------
条件是它必须将所有数量相加,直到 500。如果超过 500,则重新计数。
我已经尝试过 Rollup,但我找不到合适的条件让它发挥作用。
当然,通过编程代码而不是 SQL 更容易做到这一点,但我们必须在数据库环境中进行。获取生成行的工具可以是任何东西,循环函数、新表等。
错误解决
我在运行@Prdp 的查询时遇到了错误:
Msg 530, Level 16, State 1, Line 1
The statement terminated. The maximum recursion 100 has been exhausted before statement completion.
更新 1
使用@Prdp 的查询我们得到以下结果:
Start End rn st
(400) 424 1 24
425 449 2 48
450 474 3 72
475 499 4 96
500 524 5 120
2300 2324 6 144
2400 2499 7 243
2500 2599 8 342
2800 (2899) 9 (441)
(2900) 2999 10 99
3200 3249 11 148
3250 3299 12 197
3300 3349 13 246
3350 3399 14 295
3400 3449 15 344
3500 3549 16 393
3600 3624 17 417
3650 3674 18 441
3700 3724 19 465
3950 3964 20 479
4000 (4000) 21 (479)
(4150) 4399 22 249
4400 4499 23 348
5034 (5075) 24 (389)
它越来越接近我们的需要。是否可以只提取( 和) 之间的数据而丢弃其他数据?
我们也可以使用游标。
【问题讨论】:
-
请标记您正在使用的数据库管理系统。
-
@vkp 我们使用的数据库是sql-server-2005
-
你可以试试递归查询。
标签: sql sql-server sql-server-2005 rollup