我有一个包含这样的数据的表:
MinFormat(int) MaxFormat(int) Precision(nvarchar)
-2 3 1/2
Run Code Online (Sandbox Code Playgroud)
精度值只能是1/2,1/4,1/8,1/16,1/32,1/64.
现在我想要查询结果为 -
-2
-3/2
-1
-1/2
0
1/2
1
3/2
2
5/2
3
Run Code Online (Sandbox Code Playgroud)
任何获得结果的查询如下?
想法是根据精度值创建基于最小边界(MinFomrat col值为整数)到最大边界(MaxFormat Col值为整数)的结果.
因此,在上面的示例中,值应从-2开始,并根据精度值(1/2)生成下一个值,直到达到3
请注意,这仅适用于Precision 1/1,1/2,1/4,1/8,1/16,1/32和1/64
DECLARE @t table(MinFormat int, MaxFormat int, Precision varchar(4))
INSERT @t values(-2, 3, '1/2')
DECLARE @numerator INT, @denominator DECIMAL(9,7)
DECLARE @MinFormat INT, @MaxFormat INT
-- put a where clause on this to get the needed row
SELECT @numerator = 1,
@denominator = STUFF(Precision, 1, charindex('/', Precision), ''),
@MinFormat = MinFormat,
@MaxFormat = MaxFormat
FROM @t
;WITH N(N)AS
(SELECT 1 FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N)),
tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N,N a,N b,N c,N d,N e,N f)
SELECT top(cast((@MaxFormat- @MinFormat) / (@numerator/@denominator) as int) + 1)
CASE WHEN val % 1 = 0 THEN cast(cast(val as int) as varchar(10))
WHEN val*2 % 1 = 0 THEN cast(cast(val*2 as int) as varchar(10)) + '/2'
WHEN val*4 % 1 = 0 THEN cast(cast(val*4 as int) as varchar(10)) + '/4'
WHEN val*8 % 1 = 0 THEN cast(cast(val*8 as int) as varchar(10)) + '/8'
WHEN val*16 % 1 = 0 THEN cast(cast(val*16 as int) as varchar(10)) + '/16'
WHEN val*32 % 1 = 0 THEN cast(cast(val*32 as int) as varchar(10)) + '/32'
WHEN val*64 % 1 = 0 THEN cast(cast(val*64 as int) as varchar(10)) + '/64'
END
FROM tally
CROSS APPLY
(SELECT @MinFormat +(N-1) *(@numerator/@denominator) val) x
Run Code Online (Sandbox Code Playgroud)