Thursday, December 7, 2017

SQL basic

1. Dồn nhiều dòng thành 1 dòng trong sql
DECLARE @NAMES NVARCHAR(4000) 
SELECT @NAMES = COALESCE(@NAMES + ', ', '') + CustomerName 
FROM dbo.Customer
SELECT @NAMES

Monday, June 5, 2017

Sử dụng các hàm để tìm số lớn thứ n với n là biến truyền vào trong SQL


Nếu tìm số lớn nhất của 1 cột  trong SQL thì đơn giản chúng ta chỉ cần truy vấn cơ bản.
select max(QuotaAmt,) From erp.SRepQDtl
thì các bạn có thể tìm được dòng lớn nhất của một dòng,
Nhưng nếu tìm số lớn thứ 2 thì chúng ta phải (độ khó bắt đầu tăng lên):
select top(1)*
from erp.SRepQDtl where QuotaAmt < (select max(QuotaAmt) from erp.SRepQDtl)
Order by QuotaAmt DESC

Tất nhiên có nhiều cách khác để tìm số lớn thứ 2(các bạn tự viết nhé), nhưng nếu tìm số lớn thứ n với n là biến truyền vào thì rất khó khăn với cách viết như vậy.
Minh xin giới thiệu 3 hàm để giúp giải quyết vấn đề này.
HÀM DENSE_RANK
Cấu trúc:
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )  
 
-- xếp hạng và tăng tịnh tiến
ví dụ:
select company,SalesRepCode,FiscalYear,FiscalPeriod,QuotaAmt, DENSE_RANK() Over (Order by QuotaAmt DESC) as DenseRank
from erp.SRepQDtl
where FiscalPeriod =5

HÀM ROW(). 
Cấu trúc
--Hàm này sẽ đánh dấu số Row các dòng, kiểu Index, và nó tăng tịnh tiến kể cả số dòng đó bằng nhau
Ví dụ:
Select Company,SalesRepCode,FiscalYear,FiscalPeriod,QuotaAmt, ROW_NUMBER() Over (Order By QuotaAmt DESC)as RowNum
From erp.SRepQDtl
Where FiscalPeriod=5

Hàm RANK()
-- sử dụng hàm Rank để xếp hạng. hang này sẽ tự so sánh kết quả,không tăng tịnh tiến
Ví Dụ:
Select Company,SalesRepCode,FiscalYear,FiscalPeriod,QuotaAmt, RANK() Over (Order By QuotaAmt DESC)as XepHang
From erp.SRepQDtl
Where FiscalPeriod=5