Thêm cột STT tăng dần trong view SQL Server

Thêm cột STT tăng dần trong view SQL Server

  1. Tại sao cần thêm cột STT và View trong SQL Server
  2. STT toàn bộ tập dữ liệu với ROW_NUMBER()
  3. STT theo từng nhóm (PARTITION BY)
  4. Ổn định thứ tự & tái sử dụng
  5. Mở rộng: DENSE_RANK và RANK
  6. Bảng lưu ý & lỗi thường gặp
  7. Ghi chú quan trọng

1. Tại sao cần thêm cột STT và View trong SQL Server

Thêm cột STT tăng dần trong View SQL Server bằng hàm cửa sổ ROW_NUMBER().

Lưu ý: STT chỉ có ý nghĩa khi có thứ tự sắp xếp rõ ràng (ORDER BY).

2. STT toàn bộ tập dữ liệu với ROW_NUMBER()

Dùng ROW_NUMBER() OVER(ORDER BY ...) ngay trong câu lệnh tạo view.

Chọn cột sắp xếp ổn định (ví dụ: khóa chính).

Ví dụ 1:

 CREATE VIEW dbo.vw_SanPham_WithSTT
AS
SELECT
    ROW_NUMBER() OVER (ORDER BY sp.SanPhamID) AS STT,
    sp.SanPhamID,
    sp.TenSanPham,
    sp.Gia
FROM dbo.SanPham AS sp;
GO

-- Khi lấy dữ liệu, nếu cần sắp xếp hiển thị theo cùng thứ tự, nhớ ORDER BY tương ứng
SELECT * FROM dbo.vw_SanPham_WithSTT ORDER BY STT;

Ví dụ 2:

Select ROW_NUMBER() OVER(ORDER BY (SELECT 1)) TT,* From TABLE_NAME 

TT có thể đổi lại thành tên mong muốn trong SQL Server hiển thị ra

Ví dụ 3:

select
                ROW_NUMBER() OVER (ORDER BY _SYS_KEY) AS RowNumber
     ,* from tbChungTU

3. STT theo từng nhóm (PARTITION BY)

Nếu muốn STT bắt đầu lại từ 1 cho mỗi nhóm (ví dụ: theo DanhMucID), dùng PARTITION BY.

 CREATE VIEW dbo.vw_SanPham_TheoDanhMuc_WithSTT
AS
SELECT
    ROW_NUMBER() OVER (PARTITION BY sp.DanhMucID ORDER BY sp.SanPhamID) AS STT,
    sp.DanhMucID,
    sp.SanPhamID,
    sp.TenSanPham,
    sp.Gia
FROM dbo.SanPham AS sp;
GO

-- Ví dụ truy vấn theo từng danh mục
SELECT * FROM dbo.vw_SanPham_TheoDanhMuc_WithSTT
ORDER BY DanhMucID, STT;

4. Ổn định thứ tự & tái sử dụng

- Chọn cột ORDER BY duy nhất/ổn định (thường là Primary Key) để STT không thay đổi ngoài ý muốn.
- Trong View, mệnh đề ORDER BY không có tác dụng trừ khi kết hợp với TOP; do đó hãy đặt ORDER BY trong hàm cửa sổ và khi SELECT từ View hãy ORDER BY cùng tiêu chí để hiển thị nhất quán.

5. Mở rộng: DENSE_RANK và RANK

- RANK(): nhảy số khi có giá trị bằng nhau (1,1,3…).
- DENSE_RANK(): không nhảy số (1,1,2…).
Dùng khi bạn muốn STT theo hạng thay vì từng dòng duy nhất.

6. Bảng lưu ý & lỗi thường gặp

Tình huống Nguyên nhân Cách xử lý
STT thay đổi giữa các lần xem ORDER BY không ổn định (không duy nhất) Dùng khóa chính hoặc bộ cột đảm bảo thứ tự duy nhất trong OVER(ORDER BY …)
Không dùng được ORDER BY trong View ORDER BY trong view chỉ hợp lệ khi kết hợp TOP Đưa ORDER BY vào hàm cửa sổ; khi SELECT từ view, ORDER BY lại để hiển thị
Muốn STT theo nhóm Chưa dùng PARTITION BY Dùng ROW_NUMBER() OVER(PARTITION BY Nhom ORDER BY …)

7. Ghi chú quan trọng

- ROW_NUMBER() tạo STT theo thứ tự logic bạn định nghĩa, không phải cột vật lý như IDENTITY (IDENTITY không thể thêm trực tiếp trong View).
 

Tìm kiếm:

Bài viết liên quan:

Thêm cột STT tăng dần trong view SQL Server