Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 19

MỤC LỤC

BUỔI 1: GIỚI THIỆU CHUNG................................................................................................................2


1. Đối tượng áp dụng:....................................................................................................................2
2. Mục đích:......................................................................................................................................2
3. Thống nhất cách thức làm việc:..............................................................................................2
4. Giới thiệu về phiên bản SQL Server:.....................................................................................2
5. Lưu ý khi cài đặt SQL Server:..................................................................................................2
6. Giới thiệu về giao diện:.............................................................................................................2
7. Cách thức viết câu lệnh:...........................................................................................................2
8. Thiết kế CSDL với cấu trúc.......................................................................................................2
BUỔI 2: CÁC HÀM TRONG SQL..........................................................................................................2
1. Câu lệnh EXECUTE(‘Chuỗi’).....................................................................................................2
2. Hàm Toán học:............................................................................................................................2
3. Hàm chuỗi:...................................................................................................................................2
4. Bài tập:............................................................................................Error! Bookmark not defined.
BUỔI 3: HÀM NGÀY THÁNG.................................................................................................................2
1. Hàm ngày tháng:.........................................................................................................................2
2. Bài tập..............................................................................................Error! Bookmark not defined.
BUỔI 4: KẾT NỐI DỮ LIỆU....................................................................................................................2
1. Câu lệnh truy vấn........................................................................................................................2
2. Kết nối dữ liệu giữa các bảng.................................................................................................2
3. Bài tập..............................................................................................Error! Bookmark not defined.
BUỔI 5: CÁC HÀM TẬP HỢP VÀ GROUP BY VÀ ORDER BY.......................................................2
1. Hàm tập hợp:...............................................................................................................................2
2. Thứ tự xử lý câu lệnh:...............................................................................................................2
3. Bài tập..............................................................................................Error! Bookmark not defined.
BUỔI 6: LỆNH KẾT HỢP BẢNG VÀ BẢNG TẠM..............................................................................2
1. Lênh Union...................................................................................................................................2
2. Bảng tạm:.....................................................................................................................................2
3. Bài tập..............................................................................................Error! Bookmark not defined.
BUỔI 7: CÁC HÀM CHUYỂN KIỂU VÀ KIỂM TRA............................................................................2
1. Hàm chuyển kiểu và kiểm tra...................................................................................................2
2. Bài tập..............................................................................................Error! Bookmark not defined.
BUỔI 8: KIỂM TRA TỒN TẠI VÀ HÀM DELETE, TRUNCATE, PIVOT..........................................2
1. Kiểm tra tồn tại của bảng của field.........................................................................................2
2. Sự khác nhau giữa DELETE và TRUNCATE:......................................................................2
3. PIVOT.............................................................................................................................................2
4. Bài tập..............................................................................................Error! Bookmark not defined.
BUỔI 9: HÀM RANKING.........................................................................................................................2
1. Hàm RANKING:...........................................................................................................................2
2. Lệnh vòng lặp..............................................................................................................................2
3. Bài tập..............................................................................................Error! Bookmark not defined.
BUỔI 1: GIỚI THIỆU CHUNG
1. Đối tượng áp dụng:
- Những sinh viên năm cuối, sắp ra trường được tuyển chọn thực tập tại công ty.
- Đã được đào tạo về Cơ Sở Dữ Liệu SQL Server.

2. Mục đích:
- Giúp Sinh viên nắm vững hơn về kiến thức cơ bản.
- Tiếp cận các bài toán và thuật toán thực tế.

3. Thống nhất cách thức làm việc:


- Xin nghỉ phải xin phép (Điện thoại, Email)
- Khi làm bài xong gửi đính kém theo file và đặt tên theo quy tắc: Họ và tên + Tên Trường ĐH.
- Khi giao bài các bạn phải hoàn thành đúng theo thời gian được giao, tiếp cận kỹ năng đặt kế
hoach và hoàn thành kế hoạch.
- Đánh giá trong quá trình thực tập (thực hiện vào buổi cuối cùng).
- Đặt ra quy định về thời gian học và thời gian Nộp bài. Nếu sai phạm có thể có hình thức phạt tùy
theo từng giáo viên và từng lớp.

4. Giới thiệu về phiên bản SQL Server:


- Express
- Standard
- Developer
- Enterprise

5. Lưu ý khi cài đặt SQL Server:


- Tìm hiểu các yêu cầu của các phiên bản SQL dự định cài đặt.
- Đặt tên Instance Name.
- Mục đích cài đặt: Nếu cài đặt với mô hình lớn cần phải tìm hiểu thêm (Replication, AlwaysOn …).

6. Giới thiệu về giao diện:


- Các Database Hệ thống:
 Master: chứa thông tin về hệ thống SQL Server: Các tài khoản đăng nhập, cấu hình hệ
thống, thông tin về các cơ sở dữ liệu đã tạo, các thủ tục hệ thống, các thủ tục do người dùng
định nghĩa…Ta phải quản trị Database này cẩn thận, khi sửa đổi hệ thống thì cần Backup
database Master.
 Tempdb database chứa các đối tượng tạm thời như Global và Local Temporary Table.
Tempdb tự động khởi tạo lại khi SQL Server được khởi động lại.
 Msdb: Chứa thông tin về những bản backup của Database, thông tin về SQL Agent, SQL
Server Jobs, các cảnh báo lỗi và một vài thông tin về replication như Log Shipping
 Model database: đây là một Database template khi ta tạo các Database mới. Khi ta tạo mới
một cơ sở dữ liệu thì SQL Server lấy tất cả các mẫu (bao gồm Tables, Views,…) từ model
database.
- Security: Thông tin về user đăng nhập SQL, Các Roles, Chứng chỉ.
- Server Objects:
- Replication: Tính năng nâng cao của SQL để đồng bộ dữ liệu (Tìm hiểu ngoài)
- Always On High Avilability: Tính năng nâng cao của SQL hỗ trợ chạy SQL 24/7 giảm thiểu rủi
ro (Tìm hiểu ngoài)
- Management

Ý nghĩa các Object trong 1 Database:

 Tables
 Views
 Procedured
 Functions
 Trigger
 ...

7. Cách thức viết câu lệnh:


- Nguyên tắc người viết code: “Tinh tế trong từng câu lệnh”, luôn luôn phải hiểu “Viết ra đoạn code
để cho người khác đọc và hiểu được” do đó:
 Trình bày trong khuôn màn hình ngang máy tính
 Sử dụng tab khi lùi dòng vào phía trong
 Trình bày phải có dấu cách sau dấu “,”
 Trình bày theo khối lệnh, gọn gàng, cách dòng trong khối lệnh cho dễ quan sát
 Các từ khóa viết hoa: SELECT …FROM
- Lưu ý đến Performance của đoạn lệnh:
 Kiểm tra chỉ mục trên tất cả các field trên mệnh đề WHERE và JOIN trong câu lệnh
SQL doc them
 Giới hạn kích thước của của bảng dữ liệu làm việc: Kiểm tra các bảng được sử dụng
trong câu SELECT để có thể áp dụng lọc qua WHERE
 Chỉ chọn các field mà trong báo cáo cần, tránh thừa thông tin.
 Loại bỏ các phần tính toán trong mệnh đề WHERE và JOIN
 Đặt Index với các Field hay được truy vấn.
- Đầu mã thủ tục, hàm phải có thông tin chung:
 Người tạo
 Ngày khởi tạo
 Mô tả chung
- Mỗi lần đoạn mã được sửa đổi phải được ghi chú (Comment) rõ ràng:(--….)
 Người sửa đổi
 Ngày sửa đổi
 Nội dung chỉnh sửa
- Các đoạn lệnh có thuật toán phức tạp cần có ghi chú rõ ràng:
- Các câu ghi chú cần rõ ràng, ngắn gọn, đủ nghĩa, không dài dòng.

8. Thiết kế CSDL với cấu trúc


- Lưu ý tên trường và tên bảng đặt đúng để dễ chấm bài
- Tạo một database có tên: SvThucTap bằng cách viết lệnh SQL
- Tạo các bảng sau bằng cách viết lệnh SQL.

Customer: Danh mục đối tượng

Id Int Khóa chính, tự tăng

Code Varchar(24) Duy nhất

Name Nvarchar(128)

Type Int 0: Khách lẻ; 1: Đối tượng; 2: Công ty

StartDate Date Ngày hiệu lực. Cho phép NULL

EndDate Date Ngày hết hiệu lực. Cho phép NULL

Warehouse: Danh mục kho

Id Int Khóa chính, tự tăng

Code Varchar(24)

Name Nvarchar(128)

Item: Danh mục vật tư

Id Int Khóa chính, tự tăng

Code Varchar(24) Duy nhất

Name Nvarchar(128)
Unit Nvarchar(24)

Type Int 0:dịch vụ; 1: vật tư; 2:sản phẩm

OpenWarehouse: Tồn kho đầu kỳ

Id Int Khóa chính, tự tăng

WarehouseCod
e Varchar(24)

ItemCode Varchar(24)

Quantity Numeric(18, 5)

Amount Numeric(18, 2)

IsActive Int 0: Đình chỉ; 1: Hoạt động

Doc: Chứng từ / đầu phiếu

Id Int Khóa chính, tự tăng

DocId Varchar(16) Duy nhất, dùng để liên kết với bàng DocDetail

DocDate Date

DocNo Nvarchar(24)

Type Int 1: Nhập; 2: Xuất

CustomerCode Varchar(24)

WarehouseCod
e Varchar(24)

Description Nvarchar(128)

IsActive Int 0: Đình chỉ; 1: Hoạt động


DocDetail: Chứng từ / chi tiết phiếu

Id Int Khóa chính, tự tăng

DocId Varchar(16) Dùng để liên kết với bàng Doc

RowId Varchar(16) Duy nhất

ItemCode Varchar(24)

Quantity Numeric(18, 5)

UnitCost Numeric(18, 5)

Amount Numeric(18, 2)

- Bài làm lưu theo cấu trúc như sau: [MaLop]_[BuoiXX]_[HoTen].sql


VD: 2306_Buoi01_BinhLT.sql, 2306_Buoi03_DuyenPTT.sql
BUỔI 2: CÁC HÀM TRONG SQL
1. Câu lệnh EXECUTE(‘Chuỗi’)
- Cấu trúc: EXEC(‘SELECT * FROM DMVT’)
- Nguyên tắc biến câu lệnh Query SQL thành chuỗi trong câu lệnh Execute():
 Thêm 2 dấu nháy đơn vào đằng trước và đằng sau câu lệnh.
 Với mỗi dấu nháy đơn ở câu lệnh Query SQL thông thường khi vào chuỗi để sử dụng trong
Câu lệnh EXECUTE thì sẽ thêm 1 dấu nháy nữa Ví dụ: SELECT * FROM DMVT WHERE
Ma_Vt = ‘A01’  EXEC(‘SELECT * FROM DMVT WHERE Ma_Vt = ‘’A01’’’)
 Trường hợp muốn cộng ký tự đặc biệt vào chuỗi thì dung hàm CHAR(Mã KeyAscii). Ví dụ
CHAR(13)  Ký tự Enter, CHAR(39) ký tự nháy đơn.
https://docs.microsoft.com/en-us/sql/t-sql/functions/ascii-transact-sql?view=sql-server-ver15

- Tìm hiểu thêm EXECUTE sp_executesql

2. Hàm Toán học:

Hàm Diễn Giải

POWER(X,Y) Giá trị của X lũy thừa Y

ROUND(X,n) Số X làm tròn, n chữ số tính từ dấu thập phân

SQUARE(X) Bình phương giá trị X

SQRT(X) Căn bậc 2 giá trị X

ABS (X) Lấy giá trị tuyệt đối X

FLOOR (X) Làm tròn xuống phần nguyên giá trị X

CEILING (X) Làm tròn lên phần nguyên giá trị X

A%B Lấy số dư phép chia A/B

SIGN(X) 1- Số dương, 0- Số 0; -1 Số âm
RAND() Trả về số ngẫu nhiên

3. Hàm chuỗi:

Hàm Diễn Giải

"Chuỗi 1" + "Chuỗi 2" Nối chuỗi bằng toán tử cộng

SPACE(n) Trả về chuỗi có n khoảng trắng

LOWER(Chuỗi kỹ tự) Chuyển chuỗi thành chữ thường

UPPER(Chuỗi ký tự) Chuyển thành chữ hoa

LTRIM(Chuỗi ký tự) Trả về dữ liệu không có khoảng trắng bên trái

RTRIM(Chuỗi ký tự) Trả về dữ liệu không có khoảng trắng bên phải

Trả về dữ liệu không có khoảng trắng bên trái, bên phải

TRIM(Chuỗi ký tự) Từ SQL Server 2017 (14.x)

LEFT(Chuỗi ký tự, n) Trả về một chuỗi n ký tự tính từ bên trái

RIGHT(Chuỗi ký tự, n) Trả về một chuỗi n ký tự tính từ bên phải

SUBSTRING(Chuỗi ký tự, n1,


n2) Trả về một chuỗi bắt đầu từ vị trí n1 lấy n2 ký tự

REPLACE(Chuỗi 1, Chuỗi 2,
Chuỗi 3) Thay thế chuỗi 2 bằng chuỗi 3 ở chuỗi 1

CHARINDEX (Chuỗi 1, Chuỗi 2


[,Từ vị trí] Trả về vị trí tìm thấy Chuỗi 1 trong Chuỗi 2 [Tính từ vị trí]

STUFF(Chuỗi 1, vị trí, chiều Chèn Chuỗi 2 vào Chuỗi 1 từ "vị trí" và xóa bỏ số ký tự bằng
dài, Chuỗi 2) "chiều dài" Chuỗi 1

Trả về giá trị độ dài chuỗi 1, không bao gồm dấu cách phía bên
LEN("Chuỗi 1") phải
BUỔI 3: HÀM NGÀY THÁNG
1. Hàm ngày tháng:

Hàm Diễn Giải

GETDATE() Trả về ngày giờ hiện hành

GETUTCDATE() Trả về ngày giờ UTC hiện hành

CURRENT_TIMESTAMP Trả về ngày giờ hiện hành

DATEFROMPARTS ( year, month,


day ) Trả về giá trị ngày thông qua các tham số year, month, day

DATEADD(Datepart, n, Ngày) Thêm n (tăng/giảm) Datepart vào Ngày

DATEDIFF(DatePart, Ngày 1, Ngày


2) Trả về số DatePart giữa Ngày 1 và Ngày 2

DATEPART(DatePart, Ngày) Trả về giá trị DatePart của Ngày

DATENAME(DatePart, Ngày) Trả về giá trị DatePart của Ngày nhưng là kiểu chuỗi

DAY(Ngày 1) Trả về giá trị ngày của Ngày 1

MONTH(Ngày 1) Trả về giá trị tháng của Ngày 1

YEAR(Ngày 1) Trả về giá trị năm của Ngày 1

Trong đó, giá trị của DatePart được liệt kê như sau:

DatePart Giá trị Diễn Giải

DD 1-31 Ngày trong tháng

MM 1-12 Tháng trong năm

QQ 1-4 Quý trong năm

DW 1-7(Sun-Sat) Thứ trong tuần

YY 1753 - 9999 Năm


BUỔI 4: KẾT NỐI DỮ LIỆU
1. Câu lệnh truy vấn
SELECT: Những trường không nào có hàm đi kèm thì phải có ở dưới mệnh đề GROUP BY.

FROM: Lấy dữ liệu từ bảng nào

WHERE: Mệnh đề đề điều kiện để lọc dữ liệu

GROUP BY: Sau khi xử lý WHERE. (Sẽ có buổi chi tiết về phần này)

HAVING: Điều kiện sau khi đã GROUP BY (Sẽ có buổi chi tiết về phần này)

ORDER BY: Sắp xếp kết quả sau khi đã xử lý các mệnh đề trên. (Sẽ có buổi chi tiết về phần này)

Biểu thức điều kiện đi kèm WHERE

Hàm Kết quả

BETWEEN Giá trị 1 AND Giá trị 2

AND, OR Kết hợp điều kiện hoặc là loại trừ điều kiện.

% Đại diện cho nhiều ký tự đằng trước hoặc sau. Ký tự ‘_’ đại
LIKE kết hợp với ‘%’ hoặc ‘ _’
diện 1 ký tự

IS NULL Không dung giá trị kiểm tra = NULL mà phải dùng IS NULL

Không dung giá trị kiểm tra <> NULL mà phải dùng IS NOT
IS NOT NULL
NULL

2. Kết nối dữ liệu giữa các bảng

Nôi dung Ghi chú

INNER JOIN: Lấy thông tin chung nhau giữa bảng A và bảng B

LEFT JOIN: Lấy toàn bộ thông tin bên trái và dữ liệu bên phải có trong bên trái

RIGHT JOIN: Lấy toàn bộ thông tin bên phải và dữ liệu bên trái có trong bên
phải

FULL JOIN: Lấy toàn bộ thông tin 2 bên (đầy đủ các trường của 2 bảng) Cẩn thận, ít dùng

Kết nối kiểu FROM Table1, Table2: Giống như INNER JOIN
CROSS APPLY và OUTER APPLY: Giống INNER JOIN và LEFT nhưng có thể
liên kết với 1 hàm, hoặc cần lấy TOP.

https://www.c-sharpcorner.com/UploadFile/f0b2ed/cross-apply-and-outer-apply-
in-sql-server/

CASE WHEN … THEN … .ELSE … END

CASE … WHEN … THEN .. ELSE .. END

Ví dụ minh họa
BUỔI 5: CÁC HÀM TẬP HỢP VÀ GROUP BY VÀ ORDER BY
1. Hàm tập hợp:

Hàm Kết quả

COUNT(*) Trả về số dòng được chọn

MAX(Tên cột) Trả về giá trị lớn nhất trong Cột

MIN(Tên cột) Trả về giá trị nhỏ nhất trong Cột

AVG(Tên cột) Trả về trung bình cộng của các giá trị trong Cột

SUM(Tên cột) Trả về tổng của các giá trị trong cột

SELECT DISTINCT Trả về tập hợp giá trị là duy nhất

2. Thứ tự xử lý câu lệnh:


SELECT: Những trường không nào có hàm đi kèm thì phải có ở dưới mệnh đề GROUP BY.

FROM: Lấy dữ liệu từ bảng nào

WHERE: Mệnh đề đề điều kiện để lọc dữ liệu

GROUP BY: Sau khi xử lý WHERE.

HAVING: Điều kiện sau khi đã GROUP BY

ORDER BY: Sắp xếp kết quả sau khi đã xử lý các mệnh đề trên.

Mệnh đề: ROLLUP (dùng với mệnh đề GROUP BY): Chèn dòng tổng cho từng dòng chi tiết của
trường đầu tiên và dòng tổng cộng

SELECT Ma1, Ma2, SUM(SL)

FROM Table

WHERE Ma1 LIKE 'A%'

GROUP BY Ma1, Ma2

WITH ROLLUP

Mệnh đề: CUBE (dùng với mệnh để GROUP BY): Kết quả trả về giống ROLLUP
nhưng thêm toàn bộ dòng tổng cộng của từng trường.
Mệnh đề sắp xếp: ORDER BY (ASC: Tăng dần (mặc định), DESC: Giảm dần)

Mệnh đề: SELECT TOP n, SELECT TOP WITH TIES.

BUỔI 6: LỆNH KẾT HỢP BẢNG VÀ BẢNG TẠM


1. Lênh Union

Nội dung Ghi chú

UNION ALL: Lấy toàn bộ dữ liệu các bảng (Sẽ lấy độ rộng lớn nhất của trường
trong bảng kết nối)

UNION: Tập hợp loại trừ dữ liệu giữa các bảng giống nhau Câu lệnh chậm

INTERSECT: Giao nhau. được dùng để trả về các bản ghi nằm trong cả 2 bộ
dữ liệu hoặc lệnh SELECT. Nếu một bản ghi chỉ có trong một truy vấn chứ
không có trong truy vấn còn lại, nó sẽ bị loại bỏ khỏi bộ kết quả của
INTERSECT.

EXCEPT: Loại trừ. Toán tử EXCEPT trong SQL Server được dùng để trả về
các hàng trong lệnh SELECT đầu tiên mà không trả về trong lệnh SELECT thứ
hai. Mỗi lệnh SELECT sẽ có một bộ dữ liệu. Toán tử EXCEPT lấy bản ghi từ bộ
thứ 1 và bỏ các kết quả từ bộ 2.

2. Bảng tạm:
- Là bảng có tên có ký tự # ở đầu ví dụ: #BangKeChungTu, #SochitietTK…
- Bảng tạm có 2 loại: Bảng tạm 1 # và bảng tạm 2 # (##).
 Bảng tạm #: Session A không thể truy vấn bảng # thuộc session B.
 Bảng tạm ##: Session A có thể truy vấn bảng ## thuộc session B.
 Cách viết câu lệnh của bảng tạm cũng giống như với bảng thường tuy nhiên trước khi tạo
bảng cần viết câu lệnh kiểm tra tồn tại của bảng để nếu có thì xóa đi:
IF OBJECT_ID(‘tempdb..#TenBangTam’) IS NOT NULL DROP TABLE #TenBangTam.
DROP TABLE IF EXISTS #TenBangTam’;
- Ứng dụng của bảng tạm dùng rất nhiều trong thực tế giúp việc xử lý trung gian dữ liệu được
thuận lợi hơn.
- Câu lệnh: INSERT INTO Tên bảng (Ds trường) SELECT và INSERT INTO Tên bảng (Ds trường)
…. VALUES(….)
BUỔI 7: CÁC HÀM CHUYỂN KIỂU VÀ KIỂM TRA
1. Hàm chuyển kiểu và kiểm tra

Hàm Kết quả

Chuyển đổi dữ liệu. Ứng dụng các hàm này để chuyển đổi kiểu hoặc
CAST (<Biểu thức> AS
tạo ra 1 cột trong câu lệnh SELECT CAST (‘’ AS NVARHAR(16)) AS
<Kiểu dữ liệu>)
TenCot

Chuyển đổi dữ liệu theo định dạng (hay sử dụng cho dữ liệu kiểu
CONVERT(<Kiểu dữ ngày) VD: Chuyển kiểu ngày sang chuỗi:
liệu>, <Biểu thức> [, CONVERT(VARCHAR(10),GETDATE(),110)
<Định dạng>]) Ứng dụng các hàm này để chuyển đổi kiểu hoặc tạo ra 1 cột trong câu
lệnh SELECT CAST (‘’ AS NVARHAR(16)) AS TenCot

STR(<Số>,<Số_Ký_Tự
> [,<Số lẻ>]): Chuyển dữ liệu số sang kiểu chuỗi

Định dạng giá trị số hoặc ngày giờ.

SELECT FORMAT(123456789, '##-##-#####');


DECLARE @d DATETIME = '12/01/2018';
FORMAT(value, format, SELECT FORMAT (@d, 'd', 'en-US') AS 'US English
culture) Result',
FORMAT
(@d, 'd', 'no') AS 'Norwegian Result',
FORMAT (@d, 'd', 'zu') AS 'Zulu
Result';

DATEFROMPARTS( ye Thông qua giá trị năm, tháng, ngày, trả về kiểu ngày.
ar, month, day ) SELECT DATEFROMPARTS(2020, 5, 6)

ISNULL() Kiểm tra giá trị là null hay không thì trả về giá trị mặc định

BUỔI 8: KIỂM TRA TỒN TẠI VÀ HÀM DELETE, TRUNCATE, PIVOT.


1. Kiểm tra tồn tại
IF EXISTS(SELECT...)

- IF EXISTS(SELECT * FROM Table WHERE…): Nên sử dụng.


- IF EXISTS(SELECT TOP 1 FROM Table WHERE….): Không hiệu quả.
- IF (SELECT Count(*) FROM Table WHERE…) > 0: Không hiệu quả.

2. Sự khác nhau giữa DELETE và TRUNCATE:


- DELETE: Bản chất bản ghi chưa bị xóa khỏi CSDL (nó sẽ bị đè nếu bộ nhớ hết). Ta có thể kiểm
tra sau khi DELETE bộ nhớ không thay đổi. Vì lý do này nên chương trình sẽ Index, ràng buộc lại
(nếu có)
 Sử dụng DELETE có thể sử dụng WHERE để xóa một phần dữ liệu -> Chậm
 Nếu bảng có chứa kiểu dữ liệu IDENTITY thì khi thêm bản ghi mới dữ liệu vẫn được+1
- TRUNCATE: Bản chất xóa dữ liệu hoàn toàn khỏi CSDL mà không quan tâm ràng buộc, Index…
-> Tốc độ sẽ nhanh hơn
 Sử dụng TRUNCATE: Xóa toàn bộ bảng (không sử dụng mệnh đề WHERE)
 Nếu bảng có chứa kiểu dữ liệu IDENTITY thì khi thêm bản ghi mới dữ liệu sẽ đánh lại từ số:
1.

3. PIVOT, UNPIVOT
PIVOT cho phép phân tích bảng chéo (cross tabulation) chuyển dữ liệu từ bảng này sang bảng khác, tức
là lấy kết quả tổng hợp rồi chuyển từ dòng thành cột.
SELECT cot_dautien AS <bidanh_cot_dautien>,
[giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n]
FROM
(<bang_nguon>) AS <bidanh_bang_nguon>
PIVOT
(
ham_tong (<cot_tong>)
FOR <cot_chuyen>
IN ([giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n])
) AS <bidanh_bang_chuyen>;

UNPIVOT: Ngược lại so với PIVOT, tự tìm hiểu.

IF OBJECT_ID('Tempdb..#Tmp') IS NOT NULL DROP TABLE #Tmp


SELECT 1 AS ProductId, 'CUS001' AS CustomerCode, 2 AS Quantity, 100000 AS Amount
INTO #Tmp
UNION ALL
SELECT 2 AS ProductId, 'CUS004' AS CustomerCode, 1 AS Quantity, 200000 AS Amount
UNION ALL
SELECT 3 AS ProductId, 'CUS003' AS CustomerCode, 5 AS Quantity, 1000000 AS Amount
UNION ALL
SELECT 4 AS ProductId, 'CUS001' AS CustomerCode, 6 AS Quantity, 500000 AS Amount
UNION ALL
SELECT 5 AS ProductId, 'CUS002' AS CustomerCode, 2 AS Quantity, 100000 AS Amount
UNION ALL
SELECT 4 AS ProductId, 'CUS003' AS CustomerCode, 2 AS Quantity, 300000 AS Amount
UNION ALL
SELECT 1 AS ProductId, 'CUS003' AS CustomerCode, 3 AS Quantity, 400000 AS Amount
SELECT * FROM #Tmp ORDER BY ProductId, CustomerCode

SELECT pvt.ProductId
, pvt.CUS001 AS Col1, pvt.CUS002 AS Col2, pvt.CUS003 AS Col3, pvt.CUS004 AS Col4
FROM
(SELECT ProductId, CustomerCode, Amount
FROM #Tmp) AS t1
PIVOT
(
SUM (AMOUNT) FOR CustomerCode IN (CUS001, CUS002, CUS003, CUS004)
) AS pvt
ORDER BY ProductId

DROP TABLE #Tmp

BUỔI 9: HÀM RANKING


1. Hàm RANKING:
- ROW_NUMBER ( ) OVER ( [ <Mệnh đề PARTITION BY> ] <Mệnh đề ORDER BY>): Thường
sử dụng đánh số sắp xếp theo điều kiện (có thể có phân nhóm đánh số lại từ 1)
 ORDER BY: sắp xếp theo tuần tự
 PARTITION BY: nhóm theo điều kiện
VD: Muốn đánh số tự động 1 Table theo nhóm bộ phận có số lượng giảm dần
Row_Number() OVER(PARTITION BY Ma_Bp ORDER BY So_Luong DESC) As Sap_Xep
- RANK ( ) OVER ( [<Mệnh đề PARTITION BY>] <Mệnh đề ORDER BY>): Thường sử dụng
đánh số giống nhau nếu giá trị giống nhau và giá trị khác nhau sẽ tuần tự theo tổng số bản
ghi. VD: Có 5 bản ghi; giá trị vị trí thứ 2 và 3 giống nhau thì cách đánh số có kiểu (1 -> 2 -> 2
->4 ->5)
 ORDER BY: sắp xếp theo tuần tự
 PARTITION BY: nhóm theo điều kiện
- DENSE_RANK() OVER ( [<Mệnh đề PARTITION BY>] <Mệnh đề ORDER BY>): Thường sử
dụng đánh số giống nhau nếu giá trị giống nhau và giá trị khác nhau sẽ tuần tự theo đánh số.
VD: Có 5 bản ghi; giá trị vị trí thứ 2 và 3 giống nhau thì cách đánh số có kiểu (1 -> 2 -> 2 ->3
->4)
 ORDER BY: sắp xếp theo tuần tự
 PARTITION BY: nhóm theo điều kiện
- NTILE(n) OVER ( [<Mệnh đề PARTITION BY>] <Mệnh đề ORDER BY>): chia thành n nhóm
được đánh dấu từ 1-> n. Có thể áp dụng cho việc lấy các bản ghi có giá trị khoảng trung bình
VD: SELECT Ma_Dt FROM (SELECT Ma_Dt, So_Luong, NTILE(3) OVER (ORDER BY
So_luong) AS SL_TB FROM...) WHERE SL_TB = 2
 ORDER BY: sắp xếp theo tuần tự
 PARTITION BY: nhóm theo điều kiện
SELECT *
,ROW_NUMBER() OVER(ORDER BY DocDate) AS ROW_NUMBER
,ROW_NUMBER() OVER(PARTITION BY CustomerCode ORDER BY DocDate) AS
ROW_NUMBER_Partition
,RANK() OVER(ORDER BY CustomerCode) RANK
,DENSE_RANK() OVER(ORDER BY CustomerCode) AS DENSE_RANK
,NTILE(4) OVER(ORDER BY CustomerCode) AS NTILE
FROM Doc

2. Lệnh vòng lặp


- WHILE <điều kiện> BEGIN <biểu thức> END: Kiểm tra vòng lặp thỏa mãn điều kiện sẽ
thực hiện. Nên dùng.
- CURSOR: Kiểm tra từng bản ghi kiêu con trỏ. Dùng cẩn thận vì tốn bộ nhớ.
- GOTO: Di chuyển con trỏ. Hạn chế dùng vì thay đổi trình tự từ trên xuống dưới.

You might also like