这个问题与SQL 2012有关 - 假设我有3行生成如下:
Start Position = 10
End Position = 13
Value = 100
Start position = 14
End Position = 14
Value = 250
Start Position = 15
End Position = 25
Value = 300
在3行.. 有没有办法可以强制SQL写输出:
10 - 100
11 - 100
12 - 100
13 - 100
14 - 250
15 - 300
16 - 300
等等等等
一直绞尽脑汁但却无法轻松搞定
非常感谢
Ĵ
答案 0 :(得分:0)
您可以使用递归CTE或数字表执行此操作。假设差距不超过几百或几千:
with n as (
select row_number() over (order by (select null)) - 1 as n
from master.spt_values
)
select (t.startpos + n.n) as position, value
from t join
n
on t.startpos + n.n <= t.endpos;
答案 1 :(得分:0)
没有数据表,没有数据库是完整的!关于如何创建一个的说明遍布网络,这是一个例子:
我的数据库中有一个数字表,名为 t_numbers ,它有一个单独的列“n”,每个数字的行从1开始。它上升到999,999,但它占用了磁盘空间很小。一旦你有了这个,你可以这样写:
设置一些数据首先使用
declare @Rows table
(
StartPos int,
EndPos int,
Value int
)
insert into @Rows values (10, 13, 100), (14, 14, 250), (15, 25, 300)
如果您不希望空值的间隙使用内部联接
select n.n, Value
from t_numbers n
inner join @Rows r on n.n >= StartPos and n.n <= EndPos
如果你想要差距然后离开加入,但用where子句限制回报
select n.n, Value
from t_numbers n
left join @Rows r on n.n >= StartPos and n.n <= EndPos
where n <= (select MAX(EndPos) from @Rows)
答案 2 :(得分:0)
最后我创建了一个数字表(谢谢你们) +说
CROSS JOIN MyNumbers
在T.triangle_start_position和T.triangle_end_position之间的T.Real_Position
这给了我正在寻找的确切结果集