2017-03-10 4 views
0

Ich brauche Hilfe, weil ich Probleme habe, durchzublättern und zu begrenzen, dass jede Seite nur einen Prozess nach dem anderen anzeigt. Ich habe so viele Dinge ausprobiert und mein Gehirn wurde gebraten. Hilfe ........ Also, wenn die @PageNum = 1 and @Pagesize = 10 und wenn der erste Prozess 7 Zeilen hat; erste Seite zeigt 7 Zeilen des ersten Prozesses (genau was ich will). Nun, wenn der Benutzer @PageNum = 2 and @Pagesize is 10 wählt und der zweite Prozess 11 hat. Ich möchte, dass es die Top 10 dieses nächsten Prozesses zeigt.MS SQL Seitennummerierung und Gruppierung

Derzeit zeigt es nur die letzten 8 des zweiten Prozesses.

vereinfachte ich die SQL-Business-Informationen zu entfernen und dann nur um zu zeigen, die Liste von dem, was ich zu tun habe mit:

/* 
notes: 
Parameters passed in are @PageNum and @PageSize 
@PageNum is which page they user goes to 
@PageSize is the max number of rows to show 
*/ 

DECLARE @StartRow int, @EndRow int 
SET @StartRow = (@PageNum -1) * @PageSize +1; 
SET @EndRow = @PageNum * @PageSize; 

WITH ProcessestoPageThru AS 
(Select Name, 
     ProcessId, 
     ROW_NUMBER() OVER(ORDER BY Name, ProcessId,) as RowNo, 
     COUNT(Name) OVER() as RowCnt 
from a whole bunch of tables 
where a whole bunch of criteria 
) 

    SELECT * INTO #tmp_ProcessestoPageThru 
    From ProcessestoPageThru 
    Where RowNo BETWEEN @StartRow AND @EndRow 

    Declare @ProcessID int 
    --Get the top ProcessID, We are only going to display one Process at a  time 
    Select Top 1 @ProcessID = ProcessId 
    From #tmp_ProcessestoPageThru 

    Select * 
    from #tmp_ProcessestoPageThru 
    Where ProcessId = @ProcessId 

Bitte siehe Beispiel angebracht: auch Example enter image description here

+2

welche Version von SQL Server? –

+0

SQL Server 2008 r2 –

+1

Viel besser jus, um das Beispieldatum und das erwartete Ergebnis zu zeigen. –

Antwort

0

Versuchen Sie es mit anderen Beispieldaten.

Wenn es mit echten Daten langsam ist, dann lassen Sie mich mit Details wissen.

i) Sie übergeben nur Parameter wie @ Pageinde, @Pagesize von anderen Suchkriterien.

ii) TotalPage ist die Anzahl der Seiten, die Sie erhalten und müssen Ihre Seite accorddingly.ponto die alte Berechnung zu pumpen.

iii) rowcnt ist nicht erforderlich.

declare @Pageindex int=1 
declare @Pagesize int=10 



declare @t table(processid int, rowcnt int) 
insert into @t values(1,345),(1,345),(1,345),(1,345),(1,345),(1,345),(1,345) 
,(1,345),(1,345),(1,345),(1,345),(1,345) 
,(2,345),(2,345),(2,345),(2,345),(2,345),(2,345),(2,345),(2,345) 
,(2,345),(2,345),(2,345),(3,345),(3,345) 


;with CTE as 
(
select * 
,DENSE_RANK()over(order by processid) rownum 
--,ROW_NUMBER()over(partition by processid order by processid) rownum1 
,ROW_NUMBER()over(order by processid) rownum2 
from @t 
) 
,CTE1 AS(
select *, 
case when (rownum2/cast(@Pagesize as FLOAT))=1 then (rownum2/@Pagesize) 
ELSE (rownum2/@Pagesize)+rownum END PageIndex 

from cte c 
) 
select processid,rownum2  
,(select max(PageIndex) from cte1) TotalPage 
from cte1 
where [email protected] 
+0

musste durcharbeiten, um zu verstehen, was vor sich ging, aber das wird funktionieren !! Vielen Dank. Ich konnte es nicht herausfinden und musste die Paginierung für das Projekt aufgeben.Jetzt, da du mir das gegeben hast, öffne ich es wieder und mache es richtig :-) –

+0

@DonnaLynn, vergiss nicht, über das Leistungsproblem zu berichten, in der Tat kannst du deine echte Frage teilen, wenn nötig. – KumarHarsh

0

Sie benötigen eine PARTITION BY auf ProcessId zu tun, um die Ergebnisse von diesem Spaltenwert anzuzeigen. Hier ist der Code, der Ihnen dabei helfen kann.

;WITH ProcessestoPageThru AS 
(
Select Name, 
     ProcessId, 
     ROW_NUMBER() OVER(PARTITION BY ProcessId ORDER BY Name, ProcessId) as RowNo, 
     COUNT(Name) OVER() as RowCnt 
FROM processes 
) 
SELECT Name, 
     ProcessId, 
     RowNo, 
     RowCnt 
From ProcessestoPageThru 
Where RowNo BETWEEN @StartRow AND @EndRow 
AND ProcessId = @ProcessID 
+0

Danke ... Ich werde es versuchen –

+0

@Donna Lynn, Wenn das für Sie funktioniert, markieren Sie meinen Beitrag als Antwort markieren. – Venu

+0

Es funktioniert nicht für das, was ich mache. Trotzdem danke. –