Chương 8: Giới thiệu hàm trong SQL Server 2005
liệt kê danh sách cc
SELECT database_id, name as database_name
FROM SYS.DATABASES GO
Khi thực thi phát biểu SELECT với bảng sys.databases trong ví dụ
trên, bạn có thể tìm thấy kết quả trình bày danh sách cơ sở dữ liệu trong 8QL Server 2005 như hình 8-26-1 EB Results | Ba _ Messages! master tempdb model msdb AdventureWorks AccountSystem HRSQL RecruitVietnam AccountingSystem KHANGDB VietnameseD atabase HumanResourceAndPayroll ContactLists
Hình 8-26-1: Danh sách cơ sở đỡ liệu
Tương tự như vậy, bạn có thể liệt kê danh sách đối tượng cơ sở dữ liệu bằng cách sử dụng phát biểu như ví dụ 8-26 SELECT object_ FROM SYS.objects
WHERE schema_id=1 and parent_object_id=0
ORDER BY CREATE_DATE DESC GO
, name as object_name
Trang 2Chương 8: Giới thiệu hàm trong SQL Server 2005 39 fa’ So] Ed Results | fy Messages|) 0 1927677915 CloseMonthCashBalances 1559676604 Customers 1543676547 ywARBAndSalesAmount 1447676205 CloseAccountPayableDetails 1351675863 CloseAccountReceivableDetails _ 1303875882 CloseAccountReceivable 1143675122 CloseAccountPayable _ 1083874837 Categories - 1172199228 — udfSalessBuProduct | 1076198684 udfSalesInvoices 1044198770 udfS alesinvoicesO Province 1012198858 udfPreviousMonth 756197744 Exports 516198889 ExportDetaits 420198547 ImportDetails _ 308198148 Stocks 18 180195692 CloselnventoryControl - 84195350 MonthipinventoryControl Hình 8-27: Danh sách đối tượng cơ sở dữ liệu 2.6 Nhóm hàm Security
Nhóm hàm Security (bảo mật) bao gồm một số hàm thường sử dụng
như: CURRENT USER, USER_ID, USER_NAME, SESSION USER, IS_MEMBER, SUSER_ID, SUSER_SNAME, SYSTEM_USER, IS_SRVROLEMEMBER, SCHEMA_NAME, SCHEMA_ID, SETUSER,
Trang 3° 40 Chương 8: Giới thiệu hàm trong SQL Server 2005
Khi thực thi phát biểu SELECT với hai hàm USER_NAMEO, CURRENT_USER trong ví dụ trên, bạn có thể tìm thấy kết quả trình bày như hình 8-28 EJ Results |Eà Messages|
Hình 8-28: Gọi hàm USER_NAMEO, CURRENT_USER
Chú ý: Bạn có thể sử dụng hàm CURRENT_USER khi khai báo tạo bảng dữ liệu với giá trị mặc định ứng với cột lưu giữ tài khoản người sử dụng
Chẳng hạn, bạn khai báo phát biểu CREATE TABLE để tạo bảng dữ
liệu có tên ExchangeRate với cột UserName được khai báo giá trị mặc định là hàm CURRENT_USER như ví dụ 8-28 Ví du 8-28: Sử dụng hàm CURRENT USER CREATE TABLE ExchangeRate (
CurrencyID CHAR (3) NOT NULL,
DateOfRate SMALLDATETIME NOT NULL DEFAULT GETDATE(), Rate DECIMAL DEFAULT 0 NOT NULL ,
UserName varchar (20) NOT NULL DEFAULT CURRENT_USER PRIMARY KEY (CurrencyID, DateOfRate) GO Bằng cách sử dụng phát biểu INSERT để thêm mới dữ liệu vào bảng ExchangeRate như ví dụ 8-29 ' ExchangeRate Ví dụ 8-29: Khai báo thêm dữ liệu vào bản
INSERT INTO ExchangeRate
(CurrencyID, DateOfRate, Rate)
VALUES ('USD', GETDATE(), 16200) GO
Sau khi thêm thành công, bạn có thể liệt kê cột dữ liệu UserName
Trang 4Chương 8: Giới thiệu ham trong SQL Server 2005 a1 | Rate | UserName | + 2007-09-24 13:46:00 16200 dbo
Hinh 8-29: Si dung ham CURRENT_USER
Bạn có thể liệt kê danh sách người sử dụng trong cơ sở dữ liệu bằng cách sử dụng phát biểu như ví dụ 8-30
¡ báo liệt kê danh sá
SELECT uid, name FROM sys.sysusers WHERE islogin =1
GO
Khi thực thi phát biểu SELECT với bảng sys.sysusers trong ví dụ trên, bạn có thể tìm thấy kết quả trình bày danh sách người sử dụng trong SQL Server 2005 nhu hình 8-30 Results đà Messages) | “uid | name ~ : 1 dbo |2 2 | guest 3 3 INFORMATION_SCHEMA ey 4° sys 5 5 MYSOLUTION\Administrator 6 khangdbuser L7 7 PuchasngLser Hình 8-30: Danh sách người sử dụng 2.7 Nhóm hàm String
Nhóm hàm String (chuỗi ứng với char hay varchar) bao gồm một số
hàm thường sử dụng như: CHAR, NCHAR, LEFT, RIGHT, LEN, LTRIM, RTRIM, STR, SUBSTRING, UPPER, LOWER, PADINDEX cho phép bạn
Trang 558 Chương 8: Giới thiệu hàm trong SQL Server 2005 FIRSTROW = first_row ] LASTROW = last_row ] MAXERRORS = maximum_errors ] ROWS_PER_BATCH = rows_per_batch ]
Chẳng hạn, bạn có cơ sở dữ liệu SQL Server 2005 trong máy thứ hai
với tên RecruitVietnam, để truy vấn dữ liệu bảng tblJSCertificates, bạn
khai báo phát biểu SELECT với hàm OPENROWSET như ví dụ 8-46 NROV ' o hàm OP SELECT a FROM OPENROWSET('SQLNCLI', ‘server=khangcomputer ; database=RecruitVietnam;uid=sa;pw d=sa;', "SELECT * FROM dbo.tblusCertificates') AS a; GO
Khi thực thi phát biểu SELECT với hàm OPENROWSET thành công,
bạn có thể tìm thấy danh sách mẩu tin trong bảng tblJSCertificates trình bày như hình 8-52 EG] Resutts | Fy Messages| CettiicatelD | CettificateName ac] Not Provide P.hD Master Bachelor/Honors Degree Polytechnic/Diploma Pre-U/Junior College Post-Secondary Secondary/High School Primary/Junior High Others
Hinh 8-52: Danh sdch mdu tin trong bang tbl.JSCertificates
Tuy nhiên, bạn có thể nhận thấy lỗi phát sinh trông giống như sau:
Msg 15281, Level 16, State 1, Line 1 SQL Server blocked access to STATEMENT
'OpenRowset /OpenDatasource' of component 'Ad Hoc
Trang 6
Chuong 8: Gidi thiéu ham trong SQL Server 2005 59 For more information about enabling "Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online
Khác với SQL Server 2000 cho phép mặc định sử dụng hàm OPENROWSET khi truy cập dữ liệu đến các SQL Server khác, khi làm việc
với SQL Server 2005, bạn cần phải cấu hình cho phép sử dụng hàm này Để cho phép sử dụng hàm OPENROWSET, tif cifa sổ hình 8-47, bạn
chọn vào tùy chọn thứ hai Surface Area Configuration for Features, cửa sổ xuất hiện như hình 8-53 Oe lo .(Íac ề SQL Server 2005 Surface Area Configuration Help Protect Your SQL Server Ene ry inate mad by ag ese, Ding red ates eet set cs te ssatace area Fax delaut setings
Select a component and then config ts features:
| @ MssaiseAver | ‘The OPENROWSET and OPENDATASQUACE functions suppor ed hoc cornections
| ° 5 (8 oaxetsee (Drenete dae souceswihou irked or mole servers Enable hese hanctone or & | ‘Ad Hoc Fence Qua} #04 aopsetone and ct cal tam CLA tegration Dac | Database Mai Native XML Web Servic OLE Automation Service Boker SOL Mad wens {] Enable OPENROWSET and OPENDATASOURCE suppot | ee Ỹ Cx#—)Lœxs ] xx )( u+ )
Hinh 8-53: Cia sé Surface Area Configuration for Features
Trang 7Chương 8: Giới thiệu hàm trong SQL Server 2005
*Ä Surface Area Configuration for Features - tocathost
SQL Server 2005 Surface Area Configuration
Help Protect Your SQL Server
Enable oni the features requved by your appkcaions Disabling unused features helps protect you server by reducing the sulace area For delaut stings, eee Help Select a component and then configures featzes:
[SG wssousenven | The OPENRQWSET ard OPENOATASOURCE nce appa odbc corrections 1 Gi twam tom |smevesge ome cineg pasha acocared pateme cee "vẻ ‘Ad Hoc Remote Quenes, YU applications and scripts call them GRineose | | bac f | Database Mat Naive XML Web Servic} [2] Enable OPENROWSET and OPENDATASOURCE support OLE Automaton Service Broker | 2% G Anabe Seroces | | #iAPemngSeem | | | was —_ |View by instance | View by Component) mm Hình 8-ð4: Chọn phép sử dụng hàm OPENROWSET 3.3 Ham OPENDATASOURCE
Tương tự như hàm OPENROWSET, bạn có thể sử dụng hàm OPENDATASOURCE bằng cách khai báo như cú pháp sau:
OPENDATASOURCE ( provider_ name, init_ string )
Chú ý: Để sử dụng hàm OPENDATASOURCE, bạn cần chọn tùy chọn “Enable OPENROWSET and OPENDATASOURCE support” trong hình 8-47-2
Chẳng hạn, bạn có thể khai báo phát biểu SELECT với hàm OPENDATASOURCE để truy vấn mẩu tin trong bảng Categories như ví dụ
8-47
Ji du 8-47: Khai bao ham’ OPENDAT
SELECT CategoryId, categoryNameInVietnamese
FROM OPENDATASOURCE (' SQLNCLI',
‘Data Source=mysolution; Integrated Security=SSPI') -Account System dbo.Categories
GO
Trang 8Chương 8: Giới thiệu ham trong SQL Server 2005 61 MP? Túi xách máu tính và điện thoại di động Túi xách khác Túi xách học sinh nam Hinh 8-55: Si dung ham OPENDATASOURCE 3.4 Ham OPENXML
Ban có thể thực thi phát biểu SELECT với mệnh đề FOR XML và chỉ
định chế độ xuất dữ liệu bằng RAW, AUTO, EXPLICIT hay PATH với kết
quả trả về có định dạng XML
Loại phát biểu SELECT với mệnh đề FOR XML có thể khai báo trong
thủ tục nội tại hay hàm do người dùng định nghĩa
Chẳng hạn, bạn khai báo phát biểu SELECT để lấy ra dữ liệu trong
bảng Customers va SalesInvoices ra dinh dang XML nhu vi du 8-48
SELECT Customers CustomerId, CompanyNameInVietnamese, ProductId, Quantity, Price, Discount, VATRate
FROM Customers INNER JOIN SalesInvoices
ON Customers CustomerId = SalesInvoices.CustomerId
INNER JOIN SalesInvoiceDetails ON SalesInvoices.InvoiceNo = SalesInvoiceDetails.InvoiceNo WHERE Provinceld= 'HAN' FOR XML AUTO GO
Khi thuc phat bigéu SELECT và mệnh đề FOR XML với AUTO, bạn có
thể tìm thấy kết quả có định dạng XML như sau:
<Customers Customer Tđ= "A0003"
CompanyNameTnVietnamese= "Công ty Trách Nhiệm Hữu Hạn Kođaka Vietnam" >
<SalesInvoiceDetails ProductId="P00002" Quantity="100" Price="10000" Discount="50000" VATRate="10" />
</Customers>
<Customers CustomerId="A0004"
CompanyNameTnVietnamese= "Công ty Trách Nhiệm Hữu Hạn E-Google Vietnam">
<SalesInvoiceDetails ProductId="P00001" Quantity="250" Price="15000" Discount="50000" VATRate="10" />
Trang 9Chương 8: Giới thiệu hàm trong SQL Server 2005 <Customers CustomerId="A0003" CompanyNameTnVietnamese= "Công ty Trách Nhiệm Hữu Hạn Kodaka Vietnam">
<SalesInvoiceDetails ProductId="P00003" Quantity="300" Price="10000" Discount="50000" VATRate="10" />
</Customers>
<Customers CustomerId="A0004"
CompanyName InVietnamese="Céng ty Trach Nhiém Hau Han E-Google Vietnam">
<SalesInvoiceDetails ProductId="P00003" Quantity="120" Price="12500" Discount="55000" VATRate="10" />
</Customers>
Để xuất ra kết quả là mỗi mẩu tin ứng với một node của XML thì bạn
khai báo như ví dụ 8-49
đu 8-49: Khai báo từ khóa RAW
SELECT Customers.Customer 1d, CompanyNameInVietnamese,
ProductId, Quantity, Price, Discount, VATRate FROM Customers INNER JOIN SalesInvoices
ON Customers CustomerId = SalesInvoices.CustomerId INNER JOIN SalesInvoiceDetails ON SalesInvoices.InvoiceNo = SalesInvoiceDetails.InvoiceNo WHERE ProvincelId= 'HAN' FOR XML RAW GO
Khi thực thi phát biểu SELECT trên, kết quả trình bày là mỗi nođe ứng với mỗi mẩu tin
<row CustomerId="A0003" CompanyNameInVietnamese="Cdng ty Trách Nhiệm Hữu Han Kodaka Vietnam" ProductId="P00002*
Quantity="100" Price="10000" Discount="50000" VATRate="10" />
<row CustomerTđ="A0004" CompanyNameTnVietnamese= "Công ty
Trách Nhiệm Hữu Hạn E-Google Vietnam" ProđucETd="P00001" Quantity="250" Price="15000" Discount="50000"
VATRate="10" />
<row CustomerId="A0003" CompanyNameInvietnamese="Céng ty
Trach Nhiém Htu Han Kodaka Vietnam" Product Id="P00003" Quantity="300" Price="10000" Discount="50000"
VATRate="10" />
<row CustomerId="A0004" CompanyNameInVietnamese="Céng ty
Trách Nhiệm Hữu Hạn E-Google Vietnam" ProductId="P00003" i "120" Price="12500" Discount="55000"
"10" />
Trong trường hợp bạn muốn kết quả trình bày mỗi node ứng với một,
mau tin, mỗi mẩu tin bao gồm nhiều cột dữ liệu tứng với từng node con thì
Trang 10Chương 8: Giới thiệu hàm trong SQL Server 2005
Ví dụ 8-50: Khai báo từ khóa PATH
SELECT Customers.Customerld, CompanyNameInVietnamese,
productId, Quantity, Price, Discount, VATRate FROM Customers INNER JOIN SalesInvoices
ON Customers CustomerId = SalesInvoices.CustomerId INNER JOIN SalesInvoiceDetails ON SalesInvoices.InvoiceNo = SalesInvoiceDetails.InvoiceNo WHERE Provinceld= 'HAN' FOR XML PATH GO
Khi thực thi phát bigu SELECT trong vi du trên, bạn có thể tim thay
Trang 11Chương 8: Gidi thiéu ham trong SQL Server 2005 <Price>12500</Price> <Discount>55000</Discount> <VATRate>10</VATRate> </row>
Thay vì sử dụng phát biểu SELECT với mệnh dé FOR XML, bạn có
thể sử dụng hàm OPENXML để đọc dữ liệu từ chuỗi định đạng XML với cú
pháp như sau:
OPENXML( idoc int [ in},
rowpatternnvarchar [in], [ flagsbyte [in] ]) ( WITH ( SchemaDeclaration | TableName ) ]
Chẳng hạn, bạn khai báo tạo ra bang dif liéu có cột dữ liệu được lấy
ra từ chuỗi XML như ví dụ 8-B1
hai báo bảng dữ liệu
DECLARE @idoe int
DECLARE @doc varchar (1000) SET @doc ='
<ROOT>
<Customer>
<Order OrderID="SI00000001"
Customer ID="A0001" OrderDate="2007-09-10"> <OrderDetail ProductID="P00001" Quantity="12"/> <OrderDetail Product ID="P00002" Quantity="10"/> </Order> </Customer> <Customer> <Order OrderID="S100000002" CustomerID="A0002" OrderDate="2007-09-10"> <OrderDetail Product ID="P00001" Quantity="10"/> <OrderDetail Product ID="P00002" Quantity="20"/> </Order> </Customer> </ROOT>' EXEC sp_xml_preparedocument @idoc OUTPUT, @doc SELECT * FROM OPENXML (@idoc, * /ROOT/Customer/Order/OrderDetail',2) WITH (OrderID varchar(10) ' /@OrderID',
CustomerID char (5) *,./@CustomerID’, OrderDate datetime ' /@OrderDate', Product ID varchar (10) '@ProductID', Quantity int "@Quantity')
GO
Trang 12Chương 8: Giới thiệu hàm trong SQL Server 2005 EB Results | Gy Messages) ee A OrdelD - PusomeiD rderD b | Quantity | a A0001 2007-0910000000000 P00001 12 SID00001 A0001 2007-09-10 00:00:00.000 P00002 10 SI00000002 A0002 2007-09-10 00:00:00.000 P00001 10 4 SI00000002, A0002 2007-09-10 00;00:00.000 P00002 20 Hinh 8-56: Sở dụng hàm OPENXML
Chú ý: Để tìm hiểu chỉ tiết cách truy cập dữ liệu XML bằng đối tượng ADO.NET, bạn có thể tìm đọc quyển sách “C# 2005 - Tập 4: Lập trình cơ sở
dữ liệu” do nhà sách Minh Khai phát hành trong năm 2007
4 HÀM TRẢ VỀ GIÁ TRỊ TỔNG HỢP
(AGGREGATE)
Khi cần tổng hợp hay thống kê dữ liệu, bạn có thể sử dụng hàm như:
SUM, COUNT, AVG, MAX, MIN, CHECKSUM, CHECKSUM_AGG, STDEV, STDEVP, COUNT_BIG, VAR, GROUPING, VARP cé két hgp véi ménh dé GROUP BY
5 hàm cơ bản thường được sử dụng nhiều nhất khi khai báo phát biểu SELECT véi ménh dé GROUP BY la SUM, COUNT, AVG, MAX, MIN
Chẳng hạn, bạn có thể thống kê số lượng, gid va tién bán hàng bằng
cách khai báo mặc định GROUP BY như ví dụ 8-52 „ ProđductTd, (*) As NumberOf Product, SUM(Quantity) As TotalQuantity, MAX (Price) As MAXPrice,
MIN (Price) As MINPrice, AVG(Price) As AveragePrice, SUM(Quantity*Price) As TotalAmount, SUM(Discount) As TotalDiscount, SUM(VATRate*Quantity*Price) As VATAmount FROM Products P INNER JOIN SalesInvoiceDetails D ON P ProductId = D ProductId GROUP BY D ProductId GO
Trang 13
Chương 8: Giới thiệu hàm trong SQL Server 2005
Rests 2 Messages Se os 3:
B@Ögld NÓ, TA, MẶC Me Awags ldwMon, loaÐxaH VAiAman mH ]4 CS TU tomo HIS0BQB ero tomo) rermon 1 750 12500 1000 10997142857 9025000 160000 80250000 a EĐEU ZÄMUG gHZ) 5 a 122442574 239500 WBWU 21365000 190 13600 12800 1300000 1750000 3 17500000 9014800 12500 12000000 1245000 709 12450000
Hinh 8-57: Si dung 5 ham cơ bản
Trong trường hợp sử dụng mệnh đề GROUP BY và WITH ROLLUP, bạn có thể sử dụng hàm GROUPING như ví dụ 8-53 SELECT D ProductId, COUNT (*) As NumberOfProduct, SUM(Quantity) As TotalQuantity, AVG (Price) As AveragePrice, SUM(Quantity*Price) As TotalAmount, SUM(Discount) As TotalDiscount, SUM(VATRate*Quantity*Price) As VATAmount, GROUPING (D Product Id) FROM Products P INNER JOIN SalesInvoiceDetails D ON P ProductId = D ProductId GROUP BY D ProductId WITH ROLLUP GO
Nếu thực thi phát biểu SELECT trong ví dụ trên, bạn có thể tìm thấy kết quả trình bày như hình 8-58 202s] i Tota AverpeP nce TaA 515 -13125.000000 750 10857142857 625 1168E.6BBBBS 176 12214.285714 189 — 1300000000 4Ð — 10000000 2208 12133333333 Hình 8-58: Sử dụng hàm GROUPING
Nếu bạn có nhu cầu tính toán giá trị phương sai của cột dữ liệu giá trị số thì sử dụng hàm VAR tương tự như ví dụ 8-54
SELECT D ProductId,
Trang 14Chương 8: Giới thiệu hàm trong SQL Server 2005 AVG (Price) As AveragePrice, ` SUM(Quantity*Price) As TotalAmount, SUM(Discount) As TotalDiscount, VAR (Discount) As VarDiscount FROM Products P INNER JOIN SalesInvoiceDetails D ON P ProductId = D Productid GROUP BY D ProductId GO
Chú ý: VAR là hàm thống kê tính phương sai (variance) của một đại
lượng ngẫu nhiên
Nếu thực thi phát biểu SELECT trong ví dụ trên, bạn có thể tìm thấy
kết quả trình bày như hình 8-59 ca | Meso) TotalQuantily AveragePiice z ctaAmourt | TotaDiscoun, Viscount 515 13125000000 7187500 100000 833333333 333333 750 10857.142857 8025000 160000 523808523 809524 65 11666.666666 6812500 280000 ‘896666666 666667 176 12214285714 2136500 105000 22000000 130 13000000000 1750000 90000 450000000 9 13500000000 1245000 70000 225000000 Hình 8-ð9: Sử dụng hàm VAR
5 HAM TRA VE KHOANG GIA TRI (RANKING)
Hàm thuộc nhóm Ranking bao gồm (RANK, NTILE, DENSE_RANK,
ROW_NUMBER) tra vé giá trị ứng với thứ bậc cho mỗi hàng trong tập dữ liệu Tùy thuộc vào hàm mà bạn sử dụng, một số mẩu tin có thể nhận cùng
một thứ bậc do chúng có cùng giá trị
5.1 Ham RANK
Trang 15PA? 6s Chương 8: Giới thiệu hàm trong SQL Server 2005
WHERE D.StockTD = 'ST001"' `
ORDER BY P ProductNameInVietnamese
GO
Khi thực thi phát biểu SELECT trên, bạn có thé tim thấy danh sách mẩyu tin trình bày như hình 8-60 Túi xách Tứi xách ST001 400 Túi xách dùng cho học sinh nam ST001 700
Túi xách dùng cho học sinhnũ ST001 600
Túi xách dùng cho học sinh nũ ST001 450 Túi xách dùng cho Máy tính ST001 200
Hình 8-60: Sản phẩm nhập kho ST001
Nếu bạn muốn trình bày thứ bậc của từng sản phẩm dựa trên số lượng
nhập trong kho ST001 thì sử dụng hàm RANK và mệnh đẻ ORDER BY ứng với mã kho như ví dụ 8-B6 SELECT P.ProductTD, P.ProđuctNameTnVietnamese, D.StockID, D.Quantity, RANK () OVER (PARTITION BY D.StockID order by D.Quantity) as RANK FROM ImportDetails D JOIN Products P ON D ProductID = P Product ID WHERE D.StockID = 'ST001' ORDER BY RANK, P ProductNameInVietnamese GO
Khi thực thi phat biéu SELECT trong vi du trên, thứ bậc của sản phẩm trong kho ST001 trình bày như hình 8-61
E Results [Ey Messages] | ProductID | ProductNameinViet | 4 [ 00005 7) Ta xách dòng cho Máy ST001 - 1 P00004 Túi áo mủa ST001 400 2 |3 P0001 Túxách ST001 400 2 4 P0002 Tứxáhdừmgchohoeshnl STID0 450 4
5 PUDD01 Túixách sToo1 500 5
L8 P0002 Tai xéch ding cho hoc sinh ri ce ee 6 LZ P00003 | Tuixéch ding cho hoc sinhnam ST001 700 7
Trang 16
Chương 8: Giới thiệu ham trong SQL Server 2005 6ø [M°
Trong ví dụ trên, mẩu tin thứ 2 và 3 có cùng thứ bậc là 2, bậc kế tiếp
là 4 thay vì 3 cho mẩu tin thứ 4 bởi vì hàm RANK không tính giá trị liên
tục, thay vào đó nó tính theo số lần cấp phát thứ bậc
ð.2 Hàm NTILE
Tương tự như hàm RANK, nhung ham NTILE cho phép bạn chỉ định số ứng với thứ bậc cho trước, từ đó các mẩu tin trong bảng dữ liệu được trình bày dựa trên thứ bậc này Số thứ bậc được đánh liên tục và số mẩu tin được
chia đều cho các thứ bậc ưu tiên từ số thứ bậc nhỏ tang dan
Chẳng hạn, bạn liệt kê danh sách sản phẩm nhập vào kho ST002 bằng phát biểu SELECT như ví dụ 8-57 t Ap tr kho ST¢ SELECT P Product ID, P ProđuctNameTnVietnamese, D.StockTD, D.Quantity FROM ImportDetails D JOIN Products P ON D Product ID = P Product ID WHERE D.StockID = 'ST002' ORDER BY D.Quantity, P.ProductNameInVietnamese GO
Két qua trình bày như hình 8-62 là 11 mẩu tin được sắp xếp tăng dân theo số lượng khi thực thi phát biểu trong ví dụ trên
EH Results Hà Messages} _.|,ProductID | ProductNamelrViemamese ˆ ˆ'
(1 [D0004 | Tui áo mua
L2 PIDD02 Túixách dùngchohọc shhrũ ST002 50 c3 PÚ0007 Túi xách dùng choPC §T002 50 L4 P0005 Túi xách dùngchoMáytính ST002 70 L5 PD0002 Túi xách dùng cho học sinh rữ ST002 100 8 P0000 TúixáchdùngchoĐiệnthoạidiđộng ST002 150 7 P0007 Tứ xách dùng choPC ST002 150 L8 P0D001 Túixách sto02 200 L3 P00006 Túixách dùngchoĐiệnthoạidiđộng ST002 200 [IŨ P0001 Túixách ST002 400 LÍI P00007 Tứixách dùng cho PC $T002 700
Hình 8-62: Danh sách sản phẩm nhập uào kho ST003
Trang 17
Chương 8: Giới thiệu hàm trong SQL Server 2005 SELECT P.ProductTD, P.ProductNameInVietnamese, D.StockID, D.Quantity, RANK () OVER (PARTITION BY D.StockID order by D.Quantity) as RANK FROM ImportDetails D JOIN Products P ON D Product ID = P Product ID WHERE D.StockID = 'ST002' ORDER BY D.Quantity, P ProductNameInVietnamese GO Khi thực thi phat biéu SELECT trong vi dụ trên, kết quả như hình 8-63 (Results | By ‘Messages! Me pg ul ẩ Product|D ProductNamelnVietnamese Stock » ‘Quantity RANK 1 Tui do mula ST002 50 1
2 PO0002 = — Tui xéch diing cho hoe sinh rữ $7002 50 1
3 PI0007 Tứixách dùngchoPC ST002 50 1
4 P0005 Túi xách dùng cho Máy tính ST002 70 4 5 POO002 Tứixách dùng cho học sih nữ ST002 100 5
Trang 18
Chương 8: Giới thigu ham trong SQL Server 2005
Khi thực thi phát biểu SELECT với hàm NTILE có giá trị là 5, bạn có
thể tìm thấy kết quả trình bày như hình 8-64
Chú ý: Số mẩu tin là 11, 11 chia 5 được 2 dư 1 nên bình quân mỗi thứ bậc có 2 mẩu tin, dư 1 mẩu tin ưu tiên đưa vào bậc 1 tEq Resuls [L e ce = To SE” EmyNIG, ST002 50 1 oe Tứ xách dùng cho học sinh ri S102 50 1 3 POOO07 TứiwáchdùngchoPE ST002 50 1 4 P0005 - TứixáchdùngchoMáptính ST002 70 2 5 P00002 Tứ sáchdùngchohoesihrl ST002 100 2 § P00008 TúiwáchdùngchoĐiệnthoạidđộng ST002 150 3 7 P0007 Tứisách ding cho PC S002 150 3 8 P0001 Túiwách ST002 200 4 3 — P0008 TứixáchdùngchoĐiệnthoạidiđộng ST002 200 4 10 P0001 Tứách ST002 400 5 11 P0007 TứiwáchdùngchoPC SI002 700 5 Hình 8-64: Sử dụng hàm NTILE 5.3 Ham DENSE_RANK
Để tìm hiểu hàm DENSE_RANK, trước tiên bạn liệt kê danh sách sản phẩm nhập kho trong bảng ImportDetails có sử dụng hàm RANK với phát biểu SELECT như ví dụ 8-60 SELECT P ProductID, P ProductNameInVietnamese, D.StockID, D.Quantity FROM ImportDetails D JOIN Products P ON D Product ID = P Product ID ORDER BY D.Quantity, P.ProductNameInVietnamese GO
Khi thực thi phát biểu SELECT trên, bạn có thể tìm thấy danh sách mẩu tin trình bày như hình 8-65
Trong ví dụ trên, mẩu tin thứ 1, 2, 3 có cùng thứ bậc là 1, bậc kế tiếp là 4 thay vì 2 cho mẩu tin thứ 4 bởi vì hàm RANK không tính giá trị liên
tục mà nó tính theo số lần cấp phát thứ bậc
Nếu sử dụng hàm DENSE_RANK, bạn có thể tìm thấy thứ bậc có giá
Trang 1972 Chương 8: Giới thiệu hàm trong SQL Server 2005 [3] Resuts | y Messages] mh é y
| ProductiD " ProductNamelrVVietnamese | Stock | Quantity | RANK
Túi áo mua §T002 50 es 2 P0002 Tứxách dùngchohocsinhnl ST002 50 3 P00007 Tứixách dùngchoPC ST002 50 P00005 Túi xách dùng cho Máy tính ST002 70 P0002 Túixách dùng chohọcsinhnữH ST002 100 1 1 1 4 5 P00006 Tứixách dùng choĐiệnthoạ ST002 150 6 6 8 8 1 2 PO0007 = Tdi xach ding cho PC sT002 150 P00001 Túi xách ST002 200 _, P0000 Tứixách dùng choĐiệnthoạ ST002 200 P0005 Túi xách dùng cho Máy tính ST00 200 00004 Túi do mula -§T001 400 PO0001 Tứxách stool 400 2 PO0001 Túxách “sTo02 400 10 P00002 Tứ xách dùng chohọcsinhrl STI001 450 4 P00001 Túixách stool 500 5 _ PŨ0002 Túixáchdùngchohocsnhrl ST001 600 6 f P0D003 Tứixáchdùngchohọcsinh ST001 700 7 18_ PŨ0007 Tứixách dùng choPC $T002 700 1 Hình 8-65: Sản phẩm nhập kho Để làm điều này, bạn khai báo phát biểu SELECT với hàm DENSE_RANK như ví dụ 8-61
D.Quantity) as DENSERANK BY D.StockID order by FROM ImportDetails D JOIN Products P
ON D Product ID = P Product ID
ORDER BY D.Quantity, P ProductNameInVietnamese GO
Trang 20Chương 8: Giới thiệu hàm trong SQL Server 2005 Stock | Quantity DENSERANK | _8T002 50 1 Tứi xách dùng cho học sinh rũ ST002 50 1 Tứ xách dùng cho PC sToo2 50 1 Tứ xách dùng cho Máy tính ST002 70 2 Tứ xách dùng cho học sinh ni ST002 100 '3 Tứ xách dùng cho Điện thoại d động ST002 150 4 „ P0007 Tứixách dùng choPC ST002 150 4 P00001 Túixách ST002 200 5 P0008 Túisách dùng choĐiện thoạidiđộng ST002 200 5 PO0005 Túixách dùng cho May tinh ST001 200 1 P00004 Túiáomủa stool 400 2 ; Tứi xách stor 400 2 Tứ xách ST002 400 6 Tứi xách dùng cho học sinh rũ ST001 450 3 Tứ xách ST001 500 4 Tứ xách dừng cho học sinh rũ ST001 600 5 Tứi sách dừng cho học sinh nam STD01 700 6 Tứ xách dừng cho PC ST002 700 7 Hình 8-66: Sản phẩm nhập kho
Trong ví dụ trên, mẩu tin thứ 1, 2, 3 có cùng thứ bậc là 1, bậc kế tiếp
là 2 thay vì 4 cho mẩu tin thứ 4 bởi vì hàm DENSE_RANK tính giá trị liên
tục theo số lần cấp phát thứ bậc
5.4 Ham ROW_NUMBER
Hàm ROW_NUMBER trả về số thứ tự (số đầu tiên bắt đầu) cho mẩu
tin trong tập mẩu tin mà phát biểu SELECT trả về Hàm này thường được sử dựng để phân trang cho tập mẩu tin cần lấy ra
ROW_NUMBER () OVER ( [ <partition_by_clause> ]
<order_by_clause> )
Chẳng hạn, khi liệt kê danh sách sản phẩm nhập kho, bạn sử dụng