对于无边界表,你可以创建一个使用值的表内联构造像下面
select DISTINCT
CAST(I.LowNumber as VARCHAR) + ' - '+ CAST(I.HighNumber as VARCHAR) as FileSize,
COUNT(*) OVER (PARTITION BY lowNumber,HighNumber ORDER By lowNumber) * 100.00 /COUNT(*) OVER (ORDER BY (SELECT 1)) as percentage
from TblFile F
join (values (1, 50),(50, 150),(150, 200)) as I(LowNumber, highNumber)
on F.FileSize >=I.LowNumber and F.FileSize<I.HighNumber
Order By I.LowNumber
您的查询应该像
select DISTINCT
CAST(I.LowNumber as VARCHAR) + ' - '+ CAST(I.HighNumber as VARCHAR) as FileSize,
COUNT(*) OVER (PARTITION BY lowNumber,HighNumber ORDER By lowNumber) * 100.00 /COUNT(*) OVER (ORDER BY (SELECT 1)) as percentage
from TblFile F
join TblInterval I
on F.FileSize >=I.LowNumber and F.FileSize<I.HighNumber
说明查询:
理想情况下,您应该利用基于集合的方法并将范围值存储在表中。这样可以实现更快的处理,并且可以让您在一个地方限制外部而不是在程序中。这也符合依赖注入原则。
对于内联匿名表使用VALUES构造函数。更多关于这在this msdn link
PS:插入脚本表
--create table tblInterval (LowNumber Int, HighNumber Int)
--insert into tblInterval values
--(1,50),(50,150),(150,200)
create table tblFile (fileName int,fileSize int)
insert into tblFile values
(1 ,33)
,(2 ,198)
,(3 ,10 )
,(4 ,127)
,(5 ,85 )
,(6 ,23 )
,(7 ,105)
,(8 ,158)
,(9 ,78 )
,(10,90 )
假设你有一个表像下面
TblInterval
LowNumber HighNumber
1 50
50 150
150 200
好工作,但我不希望有界限的表。你可以重写没有边界表的好查询吗? – Arian
@Arian更新回答 – DhruvJoshi
That Works谢谢 – Arian