Für eine Abfrage, ohne dass Sie Grenzen Tabelle eine Tabelle Inline erstellen können VALUES Konstruktor wie mit unter
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
Ihre Abfrage wie
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
Erklärung aussehen sollte:
Im Idealfall sollten Sie den satzbasierten Ansatz verwenden und die Bereichswerte in einer Tabelle speichern. Dies ermöglicht eine schnellere Verarbeitung und ermöglicht Ihnen außerdem, dass ein einzelner Bereich extern und nicht in der Prozedur begrenzt wird. Dies entspricht auch dem Dependency-Injection-Prinzip.
Für Inline-anonyme Tabellen verwenden Sie VALUES-Konstruktor. Mehr dazu bei this msdn link
![Output image reference:](https://i.stack.imgur.com/uIybn.png)
PS: Legen Sie Skripte für die Tabelle
--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 )
Angenommen, Sie eine Tabelle wie haben unter
TblInterval
LowNumber HighNumber
1 50
50 150
150 200
Gute Arbeit, aber ich möchte nicht einen Tisch für Grenzen haben. Können Sie Ihre gute Abfrage ohne Begrenzungs-Tabelle erneut schreiben? – Arian
@Arian aktualisierte Antwort – DhruvJoshi
Das funktioniert Dank – Arian