Hôm nay The Code Root sẽ hướng dẫn bạn cách chuyển dữ liệu từ dòng thành cột thông qua việc sử dụng ROW_NUMBER() trong SQL Server. Vấn đề này cũng khá đơn giản, tuy nhiên chắc chắn các bạn sẽ có lúc cần dùng đến trong quá trình làm dự án thực tế.

Giả sử chúng ta có dữ liệu như sau:

Và mong muốn chuyển lại thành:

Chúng ta sẽ giải quyết vấn đề này, trước hết tạo table tạm để test data:

CREATE TABLE Test (GroupName varchar(8), ID int)
GO

INSERT INTO Test
SELECT 'Group1', 1 UNION ALL
SELECT 'Group1', 2 UNION ALL
SELECT 'Group1', 3 UNION ALL
SELECT 'Group1', 4 UNION ALL

SELECT 'Group2', 1 UNION ALL
SELECT 'Group2', 2 UNION ALL
SELECT 'Group2', 3

Tiếp theo để chuyển dữ liệu từ dòng thành cột, mong muốn mỗi group thành 1 dòng và có các cột tương ứng, các bạn xem hướng dẫn bên dưới:

SELECT GroupName,
	   MAX(CASE WHEN seq = 1 THEN ID ELSE NULL END) AS ID1,
	   MAX(CASE WHEN seq = 2 THEN ID ELSE NULL END) AS ID2,
	   MAX(CASE WHEN seq = 3 THEN ID ELSE NULL END) AS ID3,
	   MAX(CASE WHEN seq = 4 THEN ID ELSE NULL END) AS ID4
FROM
	(SELECT GroupName, ID, 
		   ROW_NUMBER() OVER(PARTITION BY GroupName ORDER BY ID) seq
	FROM Test
	) tmp
GROUP BY GroupName	

Ở đây, chúng ta sử dụng hàm ROW_NUMBER() trong SQL Server để đánh thứ tự cột. Trong đó:

Partition by: group dữ liệu theo cột. Order by: sắp xếp thứ tự trong phạm vi được qui định trong Partition by, tương tự như các dùng Order by trong câu truy vấn. Ở đây mục đích là đánh số thứ tự tăng dần theo GroupName. 

Chúc các bạn thành công! 

AutoCode.VN

 

 

 

minhnhatict@gmail.com SQL Server