SQL Server 2008 - Query to get result in fraction format

后端 未结 3 1024
挽巷
挽巷 2021-01-14 05:55

I have a table which contains data like this:

MinFormat(int)  MaxFormat(int)  Precision(nvarchar)
   -2              3             1/2

The

3条回答
  •  孤街浪徒
    2021-01-14 06:06

    Note this will only work for Precision 1/1, 1/2, 1/4, 1/8, 1/16, 1/32 and 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
    

提交回复
热议问题