Tải bản đầy đủ (.pdf) (39 trang)

Hướng dẫn SQL & XQuery cho IBM DB2, Phần 4: Phân tích dữ liệu potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (223.17 KB, 39 trang )

Hướng dẫn SQL & XQuery cho IBM DB2,
Phần 4: Phân tích dữ liệu
Sử dụng các truy vấn nâng cao để phân tích dữ liệu
Pat Moffatt, Giám đốc Chương trình quản lý thông tin, Sáng kiến học đường, IBM
Bruce Creighton, Chuyên viên lập kế hoạch các phần kỹ năng, IBM
Jessica Cao, Chuyên viên phát triển các công cụ đào tạo, IBM
Tóm tắt: Hướng dẫn này mô tả cách viết các truy vấn có yêu cầu phân tích dữ
liệu cơ bản. Phần lớn các truy vấn chứa đựng các tính toán tuần tự, hay là những
tính toán hoạt động trên một tập hợp có sắp thứ tự của các hàng -– những truy vấn
thường gặp trong khi phân tích kinh doanh. Các chức năng xử lý phân tích trực
tuyến (OLAP) tạo ra khả năng trả về các thông tin xếp hạng, đánh số hàng, và các
hàm cột hiện có như một giá trị vô hướng trong một kết quả truy vấn. Hướng dẫn
này là Phần 4 của loạt tài liệu hướng dẫn SQL & XQuery cho IBM® DB2® .
Trước khi bạn bắt đầu
Về loạt bài này
Loạt tài liệu hướng dẫn này dạy các chủ đề SQL từ cơ bản đến nâng cao và các
chủ đề XQuery cơ bản. Nó cũng chỉ ra cách diễn đạt các câu hỏi nghiệp vụ thường
gặp bằng các truy vấn cơ sở dữ liệu sử dụng các câu truy vấn SQL hay các câu
truy vấn XQuery. Những người phát triển ứng dụng và những người quản trị cơ sở
dữ liệu có thể sử dụng hướng dẫn này để nâng cao các kỹ năng truy vấn cơ sở dữ
liệu của mình. Các thành viên tham gia sáng kiến học đường IBM có thể sử dụng
loạt hướng dẫn này như một phần trong chương trình giảng dạy cơ sở dữ liệu của
họ.
Tất cả các ví dụ trong bài này dựa trên Aroma, một cơ sở dữ liệu mẫu có chứa các
dữ liệu doanh thu về các sản phẩm cà phê và chè được bán trong các cửa hàng
khắp nước Mỹ. Mỗi ví dụ gồm có ba phần:
 Một câu hỏi kinh doanh, được diễn đạt bằng ngôn ngữ hàng ngày
 Một hoặc nhiều ví dụ truy vấn, được biểu diễn bằng SQL hay Xquery
 Một bảng các kết quả được cơ sở dữ liệu trả về
Cách trình bày hướng dẫn này cho phép các học viên tìm hiểu về ngôn ngữ SQL
và XQuery. Cũng như với bất kỳ việc học tập nào, việc bổ sung thêm các bài tập


thực hành là rất quan trọng. Dữ liệu và các định nghĩa bảng tạo điều kiện thuận lợi
cho các bài tập thực hành này.
Đối với các sinh viên sử dụng tài liệu này như một phần của khoá học, hãy nhận từ
thầy hướng dẫn của mình các chỉ dẫn để kết nối tới cơ sở dữ liệu Aroma và tìm
hiểu mọi sự khác biệt giữa hướng dẫn và cài đặt tại máy cục bộ của mình.
Hướng dẫn này được viết cho Express-C 9 DB2 trên nền UNIX®, Linux® và
Windows® (trước đây gọi là Viper).
Về hướng dẫn này
Hướng dẫn này mô tả cách viết các truy vấn có yêu cầu một số cách phân tích dữ
liệu. Nhiều câu hỏi có chứa các tính toán tuần tự, hay các tính toán hoạt động trên
một tập hợp có sắp xếp thứ tự của các hàng, các câu hỏi thường gặp trong khi phân
tích hoạt động kinh doanh :
 Tổng số luỹ kế (hay tổng số dịch chuyển) theo tháng là bao nhiêu?
 Trung bình dịch chuyển theo tuần là bao nhiêu?
 Kết quả xếp hạng các số doanh thu hàng tháng như thế nào?
 Tỷ số doanh thu hiện tại hàng tháng với doanh thu hàng năm là bao nhiêu?
DB2 của IBM cung cấp một cách hiệu quả để trả lời các câu hỏi loại này khi sử
dụng các hàm SQL OLAP tiêu chuẩn có trong DB2 9. Các chức năng xử lý phân
tích trực tuyến (OLAP) tạo ra khả năng trả về các thông tin xếp hạng, đánh số
hàng, và các hàm cột hiện có như một giá trị vô hướng trong một kết quả truy vấn.
Một hàm OLAP có thể được chứa trong các biểu thức trong một danh sách chọn
lựa hay mệnh đề ORDER BY của một câu lệnh chọn.
Hướng dẫn này gồm có một loạt các ví dụ với truy vấn kinh doanh và cú pháp kết
hợp được trình bày trong mỗi trường hợp. Trước khi thực hiện các truy vấn này,
hãy đọc các mô tả toàn bộ các chức năng OLAP trong SQL Reference Guide
(Hướng dẫn Tham khảo SQL) .
Hướng dẫn này cũng cho thấy cách sử dụng các hàm vô hướng để tính toán và
trích ra các thông tin ngày tháng, ví dụ như tên ngày trong tuần và tên tháng, từ
các cột DATE (ngày tháng).
Nhiều truy vấn trong chương này dựa vào các tổng gộp doanh thu. Do các bảng

Sales (Doanh thu) lưu giữ các tổng số hằng ngày, nên thiết kế cơ sở dữ liệu của
bạn có thể bao gồm các bảng tổng gộp để trả lời các truy vấn này.
Kết nối tới một cơ sở dữ liệu
Bạn cần kết nối tới một cơ sở dữ liệu trước khi có thể sử dụng các câu lệnh SQL
để truy vấn hay xử lý dữ liệu. Lệnh CONNECT kết hợp một kết nối cơ sở dữ liệu
với một tên người sử dụng.
Thông qua người hướng dẫn tìm ra tên cơ sở dữ liệu bạn cần nối tới. Đối với loạt
bài này, tên cơ sở dữ liệu là aromadb.
Để kết nối tới cơ sở dữ liệu aromadb, gõ lệnh sau đây vào trong bộ xử lý dòng
lệnh DB2:
CONNECT TO aromadb USER userid USING password

Thay thế "userid" và "password" bằng số ID và mật khẩu của người sử dụng mà
bạn đã nhận được từ thầy hướng dẫn. Nếu máy không hỏi userid và password thì
chỉ cần gõ vào lệnh sau đây:

CONNECT TO aromadb

Thông điệp sau báo cho bạn biết rằng đã tạo kết nối thành công:
Database Connection Information
Database server = DB2/NT 9.0.0
SQL authorization ID = USERID
Local database alias = AROMADB

Khi đã kết nối được, bạn có thể bắt đầu sử dụng cơ sở dữ liệu.
Các tổng số luỹ kế
Câu hỏi
Các số doanh thu hằng ngày của mặt hàng cà phê Roma Aroma trong tháng Giêng
2006 là gì? Các tổng con lũy kế theo Đôla và các số lượng bán ra trong tháng này
là gì?

Truy vấn OLAP
SELECT date, SUM(dollars) AS total_dollars,
SUM(SUM(dollars)) OVER(ORDER BY date ROWS
UNBOUNDED PRECEDING) AS run_dollars,
SUM(quantity) AS total_qty,
SUM(SUM(quantity)) OVER(ORDER BY date ROWS
UNBOUNDED PRECEDING) AS run_qty
FROM aroma.period a, aroma.sales b, aroma.product c
WHERE a.perkey = b.perkey
AND c.prodkey = b.prodkey
AND c.classkey = b.classkey
AND year = 2006
AND month = 'JAN'
AND prod_name = 'Aroma Roma'
GROUP BY date
ORDER BY date;

Kết quả
Date Total_Dollars

Run_Dollars

Total_Qty

Run_Qty

2006-01-02

855.50 855.50 118 118
2006-01-03


536.50 1392.00 74 192
2006-01-04

181.25 1573.25 25 217
2006-01-05

362.50 1935.75 50 267
2006-01-06

667.00 2602.75 92 359
2006-01-07

659.75 3262.50 91 450
2006-01-08

309.50 3572.00 54 504
2006-01-09

195.75 3767.75 27 531
2006-01-10

420.50 4188.25 58 589
2006-01-11

547.50 4735.75 78 667
2006-01-12

536.50 5272.25 74 741
2006-01-13


638.00 5910.25 88 829
2006-01-14

1057.50 6967.75 150 979
2006-01-15

884.50 7852.25 122 1101
2006-01-16

761.25 8613.50 105 1206
2006-01-17

455.50 9069.00 66 1272
2006-01-18

768.50 9837.50 106 1378
2006-01-19

746.75 10584.25 103 1481
2006-01-20

261.00 10845.25 36 1517
2006-01-21

630.75 11476.00 87 1604
2006-01-22

813.75 12289.75 115 1719




Hàm OLAP SUM
Sự có mặt của mệnh đề OVER() phân biệt một hàm tập hợp đơn giản (SUM, MIN,
MAX, COUNT, AVG) với một hàm gộp OLAP.
Hàm OLAP SUM tạo ra các tổng dịch chuyển khi khung cửa sổ chỉ rõ:

ROWS UNBOUNDED PRECEDING

Chỉ thị này ra lệnh cho hệ thống thực hiện hàm OLAP, trong trường hợp này là
hàm SUM, trên tất cả các hàng đứng trước trong tập hợp kết quả. Bạn có thể cũng
chỉ rõ một tập con của các hàng khi sử dụng các giới hạn khác, ví dụ như GROUP-
BETWEEN. Để biết thông tin chi tiết về các khung cửa sổ, xem SQL Reference
Guide .
Mệnh đề ORDER BY trong OLAP là then chốt. Đặc tả này bảo đảm rằng các hàng
là đầu vào của hàm OLAP SUM được sắp xếp đúng thứ tự (theo ngày tháng Date,
trong trường hợp này). Nếu bạn quên sử dụng chỉ thị này, các hàng đầu vào có thể
xếp sai thứ tự lôgíc và kết quả của bạn về tổng dịch chuyển sẽ không có nghĩa.
Mệnh đề ORDER BY cuối cùng trong truy vấn chỉ tác động đến cách hiển thị tập
kết quả; nó đứng riêng và tách biệt với mệnh đề ORDER BY của hàm OLAP.


Hàm OLAP ROW_NUMBER
Bạn thậm chí có thể sử dụng các hàm OLAP cho các nhiệm vụ đơn giản như là
cung cấp số lượng dòng trong một tập hợp kết quả như trong lệnh:
SELECT ROW_NUMBER() OVER() AS row_num, order_no,
price
FROM aroma.orders;

ROW_NUM ORDER_NO PRICE

1 3600 1200.46
2 3601 1535.94
3 3602 780.00



Bắt đầu lại các tổng số luỹ kế
Câu hỏi
Các số doanh thu của Roma Aroma lũy kế trong mỗi tuần của Tháng giêng 2006 là
gì?
Truy vấn OLAP
SELECT date, SUM(dollars) AS total_dollars,
SUM(SUM(dollars)) OVER(PARTITION BY week
ORDER BY date
ROWS UNBOUNDED PRECEDING) AS
run_dollars,
SUM(quantity) AS total_qty,
SUM(SUM(quantity)) OVER(PARTITION BY week
ORDER BY date
ROWS UNBOUNDED PRECEDING) AS run_qty
FROM aroma.period a, aroma.sales b, aroma.product c
WHERE a.perkey = b.perkey
AND c.prodkey = b.prodkey
AND c.classkey = b.classkey
AND year = 2006
AND month = 'JAN'
AND prod_name = 'Aroma Roma'
GROUP BY week, date
ORDER BY week, date;


Kết quả
Date Total_Dollars

Run_Dollars

Total_Qty

Run_Qty

2006-01-02

855.50 855.50 118 118
2006-01-03

536.50 1392.00 74 192
2006-01-04

181.25 1573.25 25 217
2006-01-05

362.50 1935.75 50 267
2006-01-06

667.00 2602.75 92 359
2006-01-07

659.75 3262.50 91 450
2006-01-08

309.50 3572.00 54 504

2006-01-09

195.75 195.75 27 27
2006-01-10

420.50 616.25 58 85
2006-01-11

547.50 1163.75 78 163
2006-01-12

536.50 1700.25 74 237
2006-01-13

638.00 2338.25 88 325
2006-01-14

1057.50 3395.75 150 475
2006-01-15

884.50 4280.25 122 597
2006-01-16

761.25 761.25 105 105
2006-01-17

455.50 1216.75 66 171
2006-01-18

768.50 1985.25 106 277

2006-01-19

746.75 2732.00 103 380
2006-01-20

261.00 2993.00 36 416
2006-01-21

630.75 3623.75 87 503
2006-01-22

813.75 4437.50 115 618



Các phân vùng cửa sổ OLAP
Mệnh đề OLAP PARTITION BY bên trong mệnh đề OVER() cung cấp một
phương tiện bắt đầu lại các tính toán khi các giá trị trong các cột được phân vùng
thay đổi. Bạn có thể phân vùng các tính toán OLAP bằng một hoặc nhiều cột.
Trong truy vấn này bạn không tính đến WEEK như một cột được hiển thị mặc dù
bạn sử dụng nó trong mệnh đề PARTITION BY. Hệ thống nhận được số tuần từ
cột DATE. Tuy nhiên, các kết quả truy vấn của bạn có thể dễ dàng diễn giải hơn,
nếu bạn đưa giá trị WEEK vào trong danh sách lựa chọn của bạn và định dạng
bảng kết quả giống như kết quả khác.
Dưới đây là truy vấn được cập nhật để tính đến cột week trong lệnh chọn và kết
quả xuất ra.
SELECT date, SUM(dollars) AS total_dollars,
SUM(SUM(dollars)) OVER (PARTITION BY
week ORDER BY date
ROWS UNBOUNDED PRECEDING) AS run_dollars,

SUM(quantity) AS total_qty,
SUM(SUM(quantity)) OVER(PARTITION BY week
ORDER BY date
ROWS UNBOUNDED PRECEDING) AS run_qty,
week
FROM aroma.period a, aroma.sales b, aroma.product c
WHERE a.perkey = b.perkey
AND c.prodkey = b.prodkey
AND c.classkey = b.classkey
AND year = 2006
AND month = 'JAN'
AND prod_name = 'Aroma Roma'
GROUP BY week, date
ORDER BY week, date



Kết quả
DATE

TOTAL_DOLLARSRUN_DOLLARS

TOTAL_QTY

RUN_QTY

WEEK

2006-
01-02


855.50 855.50 118 118 2
2006-
01-03

536.50 1392.00 74 192 2
2006-
01-04

181.25 1573.25 25 217 2
2006-
01-05

362.50 1935.75 50 267 2
2006-
01-06

667.00 2602.75 92 359 2
2006-
01-07

659.75 3262.50 91 450 2
2006-
01-08

309.50 3572.00 54 504 2
2006-
01-09

195.75 195.75 27 27 3

2006-
01-10

420.50 616.25 58 85 3
2006-
01-11

547.50 1163.75 78 163 3
2006-
01-12

536.50 1700.25 74 237 3
2006-
01-13

638.00 2338.25 88 325 3
2006-
01-14

1057.50 3395.75 150 475 3
2006-
01-15

884.50 4280.25 122 597 3
2006-
01-16

761.25 761.25 105 105 4
2006-
01-17


455.50 1216.75 66 171 4
2006-
01-18

768.50 1985.25 106 277 4
2006-
01-19

746.75 2732.00 103 380 4
2006-
01-20

261.00 2993.00 36 416 4
2006-
01-21

630.75 3623.75 87 503 4
2006-
01-22

813.75 4437.50 115 618 4
Sử dụng các toán tử số học
Câu hỏi
Giá bán trung bình của mỗi sản phẩm trong năm 2004 là bao nhiêu? Tính trung
bình bằng tổng doanh thu theo Đôla chia cho tổng số lượng bán ra.
Ví dụ truy vấn
SELECT prod_name, SUM(dollars) AS total_sales,
SUM(quantity) AS total_qty,
DEC(sum(dollars)/sum(quantity), 7, 2) AS price

FROM aroma.product a, aroma.sales b, aroma.period c
WHERE a.prodkey = b.prodkey
AND a.classkey = b.classkey
AND c.perkey = b.perkey
AND year = 2004
GROUP BY prod_name
ORDER BY price;

Kết quả
Prod_Name Total_Sales Total_Qty Price

Gold Tips 38913.75 11563 3.36
Special Tips 38596.00 11390 3.38
Earl Grey 41137.00 11364 3.61
Assam Grade A 39205.00 10767 3.64
Breakfast Blend 42295.50 10880 3.88
English Breakfast 44381.00 10737 4.13
Irish Breakfast 48759.00 11094 4.39
Coffee Mug 1054.00 213 4.94
Darjeeling Number 1 62283.25 11539 5.39
Ruby's Allspice 133188.50 23444 5.68
Assam Gold Blend 71419.00 11636 6.13
Colombiano 188474.50 27548 6.84
Aroma Roma 203544.00 28344 7.18
La Antigua 197069.50 26826 7.34
Veracruzano 201230.00 26469 7.60
Expresso XO 224020.00 28558 7.84
Aroma baseball cap 15395.35 1953 7.88
Lotta Latte 217994.50 26994 8.07
Cafe Au Lait 213510.00 26340 8.10

Aroma Sounds Cassette 5206.00 620 8.39
Xalapa Lapa 251590.00 29293 8.58
NA Lite 231845.00 25884 8.95
Demitasse Ms 282385.25 28743 9.82
Aroma t-shirt 20278.50 1870 10.84
Travel Mug 1446.35 133 10.87
Darjeeling Special 127207.00 10931 11.63
Spice Sampler 6060.00 505 12.00
Aroma Sounds CD 7125.00 550 12.95
French Press, 2-Cup 3329.80 224 14.86
Spice Jar 4229.00 235 17.99
French Press, 4-Cup 3323.65 167 19.90
Tea Sampler 13695.00 550 24.90



Sử dụng các phép toán số học : ( ), +, -, *, /
Bạn có thể thực hiện các phép toán số học bên trong một danh sách lựa chọn hay
bên trong một điều kiện tìm kiếm. Một tập hợp đầy đủ các toán tử số học được liệt
kê trong bảng sau. Thứ tự mức ưu tiên đánh giá từ cao nhất tới thấp nhất (đỉnh
bảng đến đáy bảng) và, bên trong một mức đã cho, từ trái sang phải, trong bảng:
Phép toán Tên
( ) Thứ tự đánh giá bắt buộc
+, - Dương và âm
*, /
Nhân và chia

+, - Cộng và trừ
Nếu bạn có bất kỳ nghi ngờ nào về thứ tự đánh giá đối với một biểu thức đã cho,
hãy nhóm biểu thức lại bằng dấu ngoặc đơn. Ví dụ, máy chủ đánh giá (4+ 3* 2) là

10 nhưng lại đánh giá biểu thức đã nhóm (( 4+ 3)* 2) là 14.
Các lưu ý về cách dùng
Hàm DEC được dùng để loại bỏ tất cả, chỉ để lại hai chữ số thập phân trong mỗi
giá trị Price (Giá):
dec(sum(dollars)/sum(quantity), 7, 2) AS price

Để biết thêm thông tin về hàm DEC và các chức năng định dạng các kiểu dữ liệu
khác, xem SQL Reference Guide .
So sánh các tổng dịch chuyển bằng OLAP
Câu hỏi
So sánh giữa các vùng phía Tây và phía Nam về mặt các tổng dịch chuyển doanh
thu hàng ngày thế nào?
Truy vấn OLAP
SELECT t1.date, sales_cume_west, sales_cume_south,
sales_cume_west - sales_cume_south AS west_vs_south
FROM
(SELECT date, SUM(dollars) AS total_sales,
SUM(SUM(dollars)) OVER(ORDER BY date
ROWS UNBOUNDED PRECEDING) AS
sales_cume_west
FROM aroma.market a,
aroma.store b,
aroma.sales c,
aroma.period d
WHERE a.mktkey = b.mktkey
AND b.storekey = c.storekey
AND d.perkey = c.perkey
AND year = 2006
AND month = 'MAR'
AND region = 'West'

GROUP BY date) AS t1 JOIN
(SELECT date, SUM(dollars) AS total_sales,
SUM(SUM(dollars)) OVER(ORDER BY date
ROWS UNBOUNDED PRECEDING) AS
sales_cume_south
FROM aroma.market a,
aroma.store b,
aroma.sales c,
aroma.period d
WHERE a.mktkey = b.mktkey
AND b.storekey = c.storekey
AND d.perkey = c.perkey
AND year = 2006
AND month = 'MAR'
AND region = 'South'
GROUP BY date) AS t2
ON t1.date = t2.date
ORDER BY date;



Kết quả
DATE Sales_Cume_West Sales_Cume_South WEST_VS_SOUTH
2006-03-01 2529.25 2056.75 472.50
2006-03-02 6809.00 4146.75 2662.26
2006-03-03 9068.75 6366.55 2702.20

2006-03-29 100513.85 62891.35 37622.50
2006-03-30 104267.40 65378.75 38888.65
2006-03-31 107222.15 68100.75 39121.40



Mệnh đề OLAP ORDER BY
Một lợi thế của cách tiếp cận OLAP đối với tính toán chuỗi dịch chuyển là khả
năng đặt chúng bên trong các truy vấn phụ. Việc sắp xếp thứ tự OLAP là một phần
của chính bản thân hàm, và mỗi hàm OLAP có mệnh đề ORDER BY riêng của
mình, độc lập với mệnh đề ORDER BY nằm cuối, thuộc truy vấn.
Trong truy vấn này mệnh đề ORDER BY DATE có trong mỗi hàm OLAP để bảo
đảm các giá trị đúng được dùng để tính toán các tổng dịch chuyển. Tại cuối truy
vấn có thêm một mệnh đề ORDER BY DATE nữa để điều khiển cách hiển thị tập
hợp kết quả.
Các chú ý với truy vấn
Việc so sánh dịch chuyển giữa doanh thu của phía Tây và phía Nam được tính
toán khi sử dụng phép tính số học đơn giản trong lệnh SELECT.
Trung bình trượt
Số tiền bán hàng dao động theo thời gian; khi dao động quá mạnh, chúng sẽ che
lấp các xu thế dài hạn, nằm ngầm bên dưới. Các giá trị trung bình trượt được dùng
để san bằng các ảnh hưởng của các dao động này. Ví dụ, giá trị trung bình trượt
theo ba tuần là kết quả chia tổng gộp của ba tuần liên tiếp gần nhất cho ba.
Câu hỏi
Giá trị trung bình trượt ba tuần của doanh thu sản phẩm tại các cửa hàng ở San
Jose và Miami trong quý ba năm 2005 là bao nhiêu?
Truy vấn OLAP
SELECT city, week, SUM(dollars) AS sales,
DEC(AVG(SUM(dollars)) OVER(partition by city
ORDER BY city, week ROWS 2 PRECEDING),7,2)
AS mov_avg,
SUM(SUM(dollars)) OVER(PARTITION BY city
ORDER BY week ROWS unbounded PRECEDING)
AS run_sales

FROM aroma.store a,
aroma.sales b,
aroma.period c
WHERE a.storekey = b.storekey
AND c.perkey = b.perkey
AND qtr = 'Q3_05'
AND city IN ('San Jose', 'Miami')
GROUP BY city, week;

Trong tập hợp kết quả sau đây, chú ý rằng các giá trị trung bình trong hai hàng đầu
tiên với mỗi thành phố không phải là giá trị trung bình trượt ba tuần vì không có
đủ 3 dữ liệu để hoàn thành một tính toán như vậy. Thay vào đó, hai giá trị trung
bình ấy được tính toán đối với hàng đầu tiên (giá trị trung bình một tuần) và đối
với hàng đầu tiên và hàng thứ hai (giá trị trung bình hai tuần) một cách tương ứng.


Kết quả
City Week Sales Mov_avg Run_sales
Miami 27 1838.55 1838.55 1838.55
Miami 28 4482.15 3160.35 6320.70
Miami 29 4616.70 3645.80 10937.40
Miami 30 4570.35 4556.40 15507.75
Miami 31 4681.95 4623.00 20189.70

Miami 38 5500.25 5235.00 49493.35
Miami 39 4891.40 5346.71 54384.75
Miami 40 3693.80 4695.15 58078.55

San Jose 27 3177.55 3177.55 3177.55
San Jose 28 5825.80 4501.67 9003.35

San Jose 29 8474.80 5826.05 17478.15
San Jose 30 7976.60 7425.73 25454.75
San Jose 31 7328.65 7926.68 32783.40
San Jose 32 6809.75 7371.66 39593.15
San Jose 33 7116.35 7084.91 46709.50

Hàm DEC dùng để định nghĩa có bao nhiêu chữ số sẽ được hiển thị trong giá trị
được trả về cho cột Mov_Avg . Để biết các chi tiết về hàm này, xem SQL
Reference Guide .


Hàm OLAP AVG
Hàm OLAP AVG được sử dụng cùng với khung cửa sổ sau đây:
ROWS n PRECEDING

ở đây n là một số đại diện cho hệ số san bằng muốn có. Trong truy vấn trước đây
giá trị này nói chung được thiết lập bằng từ khóa “unbounded” (không giới hạn).
Trong truy vấn này, vì bạn muốn tính giá trị trung bình trượt theo 3 hàng, bạn chèn
giá trị 2, để ngụ ý hàng hiện tại cộng với hai hàng trước.
Mệnh đề OLAP ORDER BY bảo đảm rằng hàm AVG được áp dụng vào chuỗi
dịch chuyển đúng của các hàng (trong trường hợp này là WEEK). Mệnh đề
PARTITION BY xác định giá trị mà theo nó hàm AVG sẽ được bắt đầu lại (trong
trường hợp này là CITY).
Các tổng trượt
Câu hỏi
Tổng trượt theo từng bảy ngày của số lượng cà phê Demitasse Ms được bán trong
Tháng Ba 2006 là gì?
Truy vấn OLAP
SELECT date, SUM(quantity) AS day_qty,
DEC(SUM(SUM(quantity)) OVER(ORDER BY date

ROWS 6 PRECEDING),7,2) AS mov_sum
FROM aroma.sales a, aroma.period b, aroma.product c
WHERE b.perkey = a.perkey
AND c.classkey = a.classkey
AND c.prodkey = a.prodkey
AND year = 2006
AND month = 'MAR'
AND prod_name = 'Demitasse Ms'
GROUP BY date
ORDER BY date;

Tập hợp kết quả OLAP sau đây có chứa các tổng số dịch chuyển cho tất cả các
hàng. Giống như trong truy vấn trung bình trượt trước đây, các giá trị thực tế của

×