2017-07-21 12 views
0

DBからページ単位の結果にアクセスしようとしています。以下のクエリ次のとおりです。hereからoracle sql全ページまたは合計エントリのページ番号

SELECT * FROM 
(
    SELECT a.*, rownum r__ 
    FROM 
    (
     SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%' 
     ORDER BY OrderDate DESC, ShippingDate DESC 
    ) a 
    WHERE rownum < ((pageNumber * pageSize) + 1) 
) 
WHERE r__ >= (((pageNumber-1) * pageSize) + 1) 

、私はページネーションを達成することができています。

私は同様に全カウントを取得するためにinorderを以下のようにクエリを変更:

SELECT * FROM 
(
    SELECT a.*, rownum r__ , count(OrderDate) 
    FROM 
    (
     SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%' 
     ORDER BY OrderDate DESC, ShippingDate DESC 
    ) a group by OrderDate 
) 
WHERE r__ between (pageNumber * pageSize)+ 1 and (pageNumber *pageSize) + pageSize; 

をしかし、要求されたページは同様に、最後のページであれば、私はまた、総ページ数を計算したいと。私は内部クエリのCOUNTを取得しようとしましたので、私のコード内の合計ページを計算することができますが、取得できませんでした。私はCOUNT(ORDERDATE)とグループ分けで試しましたが、うまくいきません。

どうすればいいか教えてください。

答えて

1

私は例えば、あなたがしようとしている仕事をするために分析関数を使用します。:

SELECT res.*, 
     CEIL(total_num_rows/pagesize) total_num_pages 
FROM (SELECT o.*, 
       row_number() OVER (ORDER BY orderdate DESC, shippingdate DESC) rn, 
       COUNT(*) OVER() total_num_rows 
     FROM orders o 
     WHERE customerid LIKE 'A%') res 
WHERE rn BETWEEN (pagenumber - 1) * pagesize + 1 AND pagenumber * pagesize; 

N.B.テストされていない。

row_number()解析関数を使用して、各行に、指定されたグループにわたって、および指定された順序で番号を割り当てることによって、ページ付けが行われます。 OVERセクションにはpartition by節がないため、この関数は行セット全体で機能しています。

同様にcount()解析関数を使用して、指定されたグループ全体の行数を取得します。また、partition by by句を指定していないため、この関数は行セット全体で機能します。

これらの数字があるので、ページ番号を指定して総ページ数を見つけるのは簡単なことです。

+1

素晴らしい!これは期待どおりに動作し、また私に合計ページを与えます。ありがとうございます:) – v1shnu

1

は、Oracle 12.1上にある以降、これが簡単になる場合:

select o.* 
    , 'Page ' || pagenumber || ' of ' || ceil(count(*) over()/pagesize) as pagecount 
from orders o 
where customerid like 'T%' 
order by orderdate desc, shippingdate desc 
offset (pagenumber -1) * pagesize rows fetch next pagesize rows only; 

page count列はPage 2 of 34のような値を報告します。

+0

Unforntunately、私たちはまだ古いバージョンです。うまくいけば、これはそのバージョンで同じ要件を持つ人々にとっては有用かもしれません。 – v1shnu

関連する問題