首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 表數據排序與分組技巧:無 ID 欄位也能輕鬆生成行號與分頁

     編輯:關於SqlServer

在資料庫開發中,常會遇到需要對沒有排序 ID 的資料表進行排序,並為每一行產生流水號的需求。這相當於在視圖中為每一行新增一個自動遞增的「ID」號。透過自我連結(Self-Join)與聚合函數,即可輕鬆達成。

基本排序與行號生成

假設有一個 cPayroll 資料表,其中 Badge 為員工編號。若要依 Badge 排序並產生行號 xOrder,可撰寫如下查詢:

SELECT a.Badge, COUNT(a.Badge) AS xOrder
FROM cPayroll a, cPayroll b
WHERE a.Badge >= b.Badge
GROUP BY a.Badge;

此語句利用「大於等於」條件進行自我連結,配合 COUNT 計算每個 Badge 之前(含自身)有多少筆資料,即為排序後的行號。

進階應用:固定筆數分組與分頁

在掌握排序邏輯後,稍作修改即可實現「每 20 筆為一組」的分組功能,適合分頁顯示。例如:前 20 列為第 1 組(G1),21-40 列為第 2 組(G2),以此類推。

SELECT 
    Badge, 
    COUNT(a.Badge) AS xOrder,
    CAST(((COUNT(a.Badge) - 1) / 20) + 1 AS VARCHAR(10)) AS [Group]
FROM cPayroll a, cPayroll b
WHERE a.Badge >= b.Badge
GROUP BY a.Badge;

產生的視圖資料如下:

BadgexOrderGroup
A11G1
A22G1
.........
B121G2
B222G2
.........
C141G3

有了這個視圖,應用程式即可用簡單的 SELECT * FROM ViewName WHERE [Group] = 'G1' 進行分組或分頁查詢,無需在前端處理複雜的分頁邏輯。

原理說明

  • 自我連結:a.Badge >= b.Badge 讓每一行與「排序值小於或等於自己」的所有行配對。
  • COUNT 計數:配對後的行數即為該行在排序後的位置(從 1 開始)。
  • 分組公式:((行號 - 1) / 每組筆數) + 1,利用整數除法特性自動歸組。

此技巧不依賴 IDENTITY 欄位,適用於任何可排序的欄位,是早期 SQL Server 版本(如 SQL 2000/2005)常用的分頁寫法。現代版本建議改用 ROW_NUMBER() 視窗函數,效能與可讀性更佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved