1. Trang chủ
  2. » Công Nghệ Thông Tin

SQL server 2005 – Lập trình, thủ tục và hàm part 2 doc

20 261 0
Tài liệu được quét OCR, nội dung có thể không chính xác

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 13,59 MB

Nội dung

Trang 1

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 2

Chươ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 4

Chươ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 5

58 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 7

Chươ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 8

Chươ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 9

Chươ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 10

Chươ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 11

Chươ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 12

Chươ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 14

Chươ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 15

PA? 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 19

72 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 20

Chươ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

Ngày đăng: 11/08/2014, 00:24

TỪ KHÓA LIÊN QUAN