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

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

39 18 0

Đ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

Nội dung

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

Hướng dẫn SQL & XQuery cho IBM DB2, Phần 4: Phân tích liệu Sử dụng truy vấn nâng cao để phân tích 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 phần kỹ năng, IBM Jessica Cao, Chuyên viên phát triển cơng cụ đào tạo, IBM Tóm tắt: Hướng dẫn mơ tả cách viết truy vấn có u cầu phân tích liệu Phần lớn truy vấn chứa đựng tính tốn tuần tự, tính tốn hoạt động tập hợp có thứ tự hàng -– truy vấn thường gặp phân tích kinh doanh Các chức xử lý phân tích trực tuyến (OLAP) tạo khả trả thông tin xếp hạng, đánh số hàng, hàm cột có giá trị vô hướng kết truy vấn Hướng dẫn Phần loạt tài liệu hướng dẫn SQL & XQuery cho IBM® DB2® Trước bạn bắt đầu Về loạt Loạt tài liệu hướng dẫn dạy chủ đề SQL từ đến nâng cao chủ đề XQuery Nó cách diễn đạt câu hỏi nghiệp vụ thường gặp truy vấn sở liệu sử dụng câu truy vấn SQL hay câu truy vấn XQuery Những người phát triển ứng dụng người quản trị sở liệu sử dụng hướng dẫn để nâng cao kỹ truy vấn sở liệu Các thành viên tham gia sáng kiến học đường IBM sử dụng loạt hướng dẫn phần chương trình giảng dạy sở liệu họ Tất ví dụ dựa Aroma, sở liệu mẫu có chứa liệu doanh thu sản phẩm cà phê chè bán 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, diễn đạt ngôn ngữ hàng ngày  Một nhiều ví dụ truy vấn, biểu diễn SQL hay Xquery  Một bảng kết sở liệu trả Cách trình bày hướng dẫn cho phép học viên tìm hiểu ngơn ngữ SQL XQuery Cũng với việc học tập nào, việc bổ sung thêm tập thực hành quan trọng Dữ liệu định nghĩa bảng tạo điều kiện thuận lợi cho tập thực hành Đối với sinh viên sử dụng tài liệu phần khoá học, nhận từ thầy hướng dẫn dẫn để kết nối tới sở liệu Aroma tìm hiểu khác biệt hướng dẫn cài đặt máy cục Hướng dẫn viết cho Express-C DB2 UNIX®, Linux® Windows® (trước gọi Viper) Về hướng dẫn Hướng dẫn mô tả cách viết truy vấn có yêu cầu số cách phân tích liệu Nhiều câu hỏi có chứa tính tốn tuần tự, hay tính tốn hoạt động tập hợp có xếp thứ tự hàng, câu hỏi thường gặp 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 bao nhiêu?  Trung bình dịch chuyển theo tuần bao nhiêu?  Kết xếp hạng số doanh thu hàng tháng nào?  Tỷ số doanh thu hàng tháng với doanh thu hàng năm bao nhiêu? DB2 IBM cung cấp cách hiệu để trả lời câu hỏi loại sử dụng hàm SQL OLAP tiêu chuẩn có DB2 Các chức xử lý phân tích trực tuyến (OLAP) tạo khả trả thông tin xếp hạng, đánh số hàng, hàm cột có giá trị vơ hướng kết truy vấn Một hàm OLAP chứa biểu thức danh sách chọn lựa hay mệnh đề ORDER BY câu lệnh chọn Hướng dẫn gồm có loạt ví dụ với truy vấn kinh doanh cú pháp kết hợp trình bày trường hợp Trước thực truy vấn này, đọc mô tả toàn chức OLAP SQL Reference Guide (Hướng dẫn Tham khảo SQL) Hướng dẫn cho thấy cách sử dụng hàm vô hướng để tính tốn trích thơng tin ngày tháng, ví dụ tên ngày tuần tên tháng, từ cột DATE (ngày tháng) Nhiều truy vấn chương dựa vào tổng gộp doanh thu Do bảng Sales (Doanh thu) lưu giữ tổng số ngày, nên thiết kế sở liệu bạn bao gồm bảng tổng gộp để trả lời truy vấn Kết nối tới sở liệu Bạn cần kết nối tới sở liệu trước sử dụng câu lệnh SQL để truy vấn hay xử lý liệu Lệnh CONNECT kết hợp kết nối sở liệu với tên người sử dụng Thơng qua người hướng dẫn tìm tên sở liệu bạn cần nối tới Đối với loạt này, tên sở liệu aromadb Để kết nối tới sở liệu aromadb, gõ lệnh sau vào xử lý dòng lệnh DB2: CONNECT TO aromadb USER userid USING password Thay "userid" "password" số ID mật người sử dụng mà bạn nhận từ thầy hướng dẫn Nếu máy khơng hỏi userid password cần gõ vào lệnh sau đây: CONNECT TO aromadb Thông điệp sau báo cho bạn biết 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 bắt đầu sử dụng sở liệu Các tổng số luỹ kế Câu hỏi Các số doanh thu ngày mặt hàng cà phê Roma Aroma tháng Giêng 2006 gì? Các tổng lũy kế theo Đơla số lượng bán tháng 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 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 mệnh đề OVER() phân biệt hàm tập hợp đơn giản (SUM, MIN, MAX, COUNT, AVG) với hàm gộp OLAP Hàm OLAP SUM tạo tổng dịch chuyển khung cửa sổ rõ: ROWS UNBOUNDED PRECEDING Chỉ thị lệnh cho hệ thống thực hàm OLAP, trường hợp hàm SUM, tất hàng đứng trước tập hợp kết Bạn rõ tập hàng sử dụng giới hạn khác, ví dụ GROUPBETWEEN Để biết thông tin chi tiết khung cửa sổ, xem SQL Reference Guide Mệnh đề ORDER BY OLAP then chốt Đặc tả bảo đảm hàng đầu vào hàm OLAP SUM xếp thứ tự (theo ngày tháng Date, trường hợp này) Nếu bạn quên sử dụng thị này, hàng đầu vào xếp sai thứ tự lơgíc kết bạn tổng dịch chuyển khơng có nghĩa Mệnh đề ORDER BY cuối truy vấn tác động đến cách hiển thị tập kết quả; đứng riêng tách biệt với mệnh đề ORDER BY hàm OLAP Hàm OLAP ROW_NUMBER Bạn chí sử dụng hàm OLAP cho nhiệm vụ đơn giản cung cấp số lượng dòng tập hợp kết lệnh: SELECT ROW_NUMBER() OVER() AS row_num, order_no, price FROM aroma.orders; ROW_NUM ORDER_NO PRICE 3600 1200.46 3601 1535.94 3602 780.00 Bắt đầu lại tổng số luỹ kế Câu hỏi Các số doanh thu Roma Aroma lũy kế tuần Tháng giêng 2006 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 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 Mệnh đề OLAP ORDER BY bảo đảm hàm AVG áp dụng vào chuỗi dịch chuyển hàng (trong trường hợp WEEK) Mệnh đề PARTITION BY xác định giá trị mà theo hàm AVG bắt đầu lại (trong trường hợp CITY) Các tổng trượt Câu hỏi Tổng trượt theo bảy ngày số lượng cà phê Demitasse Ms bán Tháng Ba 2006 gì? Truy vấn OLAP SELECT date, SUM(quantity) AS day_qty, DEC(SUM(SUM(quantity)) OVER(ORDER BY date ROWS 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 OLAP sau có chứa tổng số dịch chuyển cho tất hàng Giống truy vấn trung bình trượt trước đây, giá trị thực tế sáu hàng không hiển thị tổng trượt bảy ngày mong muốn; bạn cần có bảy hàng để hiển thị xác giá trị Kết Date Day_Qty Mov_Sum 2006-03-01 65 65.00 2006-03-02 19 84.00 2006-03-03 92 176.00 2006-03-04 91 267.00 2006-03-05 106 373.00 2006-03-06 92 465.00 2006-03-07 102 567.00 2006-03-08 21 523.00 2006-03-09 74 578.00 2006-03-10 81 567.00 2006-03-11 77 553.00 2006-03-12 127 574.00 2006-03-13 169 651.00 2006-03-14 31 580.00 2006-03-15 56 615.00 2006-03-16 40 581.00 2006-03-17 84 584.00 2006-03-18 34 541.00 2006-03-19 128 542.00 2006-03-20 97 470.00 2006-03-21 50 489.00 2006-03-22 147 580.00 Một hàm tổng dịch chuyển, giống trung bình dịch chuyển, dùng để san ảnh hưởng dao động Ví dụ, tổng trượt bảy ngày tính tốn cách lấy tổng bảy ngày liên tiếp Hàm vô hướng DEC dùng để định nghĩa giá trị thập phân trả cho cột Mov_Sum Để biết chi tiết hàm này, xem SQL Reference Guide Chú ý ví dụ này, DEC làm cho kết hiển thị dạng thập phân liệu sở có định dạng số nguyên Hàm OLAP SUM Hàm OLAP SUM tạo tổng trượt khung cửa sổ rõ: ROWS n PRECEDING Cũng sử dụng từ khóa FOLLOWING Mệnh đề ORDER BY OLAP then chốt Đặc tả bảo đảm hàng đầu vào hàm OLAP SUM xếp thứ tự (theo Date tăng dần, trường hợp này) Xếp hạng liệu Câu hỏi Xếp hạng theo tổng doanh thu đôla Tháng Ba năm 2005 cửa hàng vùng phía Tây nào? Truy vấn OLAP SELECT store_name, district, SUM(dollars) AS total_sales, RANK() OVER(ORDER BY SUM(dollars) DESC) AS sales_rank 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 = 2005 AND month = 'MAR' AND region = 'West' GROUP BY store_name, district; Kết Store_Name District Total_SalesSales_Rank Cupertino Coffee Supply San Francisco 18670.50 Java Judy's Los Angeles 18015.50 Beaches Brew Los Angeles 18011.55 San Jose Roasting Company San Francisco 17973.90 Instant Coffee San Francisco 15264.50 Roasters, Los Gatos San Francisco 12836.50 Các tổng số ngày từ bảng Sales thoả mãn điều kiện tìm kiếm mệnh đề WHERE cộng lại, sau xếp hạng Hàm OLAP RANK Cơ sở liệu IBM DB2 hỗ trợ tập hợp hàm xếp hạng OLAP, gồm có RANK() DENSE_RANK() Các hàm không yêu cầu đối số nào; thay vào đó, mệnh đề OLAP ORDER BY định nghĩa cột hay biểu thức để dựa vào mà xếp hạng Chú ý thứ tự xếp mặc định hàm OLAP tăng dần (ASC), thường cách xếp hạng mong muốn cho truy vấn kinh doanh Bạn phải rõ từ khóa DESC mệnh đề OLAP ORDER BY để gán thứ hạng từ cao đến thấp (ở giá trị cao nhất) Hàm DENSE_RANK khác với với RANK chi tiết cụ thể: bạn sử dụng hàm RANK, có ngang hai nhiều hàng giá trị thứ hạng nhảy qua xuống Nếu hai hàng ngang xếp hạng 2, vị trí (như 1,2,2,4) Khi bạn sử dụng DENSE_RANK, khơng có khe hở chuỗi giá trị thứ hạng Ví dụ, hai hàng xếp vị trí 8, vị trí 9, ví dụ sau: SELECT prod_name, dollars, DENSE_RANK() OVER(ORDER BY dollars DESC) AS dense_rank, RANK() OVER(ORDER BY dollars DESC) AS tie_rank 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 date = '01-03-2006'; Kết PROD_NAME DOLLARS DENSE_RANK TIE_RANK Espresso Machine Italiano 499.75 1 Cafe Au Lait 392.00 2 Veracruzano 360.00 3 Lotta Latte 328.00 4 NA Lite 306.00 5 Colombiano 283.50 6 Darjeeling Special 207.00 7 Colombiano 202.50 8 Colombiano 202.50 8 Expresso XO 201.50 10 Xalapa Lapa 195.50 10 11 Sử dụng tính tốn DATE Câu hỏi Tính tốn ngày tháng trước 90 ngày sau 90 ngày so với ngày tháng cho Ví dụ truy vấn SELECT date - 90 DAYS AS due_date, date AS cur_date, date + 90 DAYS AS past_due FROM aroma.period WHERE year = 2004 AND month = 'JAN'; Kết Due_Date 2003-10-03 Cur_Date 2004-01-01 Past_Due 2004-03-31 2003-10-04 2004-01-02 2004-04-01 2003-10-05 2004-01-03 2004-04-02 Tăng giảm ngày tháng Bạn thêm vào hay xố ngày tháng Để làm bạn phải rõ thông tin sau đây:  Giá trị tăng hay giảm (tên cột hay biểu thức datetime)  Thành phần áp dụng (các) cách tăng Thành phần ngày, tháng, năm hay kết hợp giá trị  Giá trị mức tăng lên dương hay âm Về truy vấn Ví dụ truy vấn tính tốn ngày tháng trước 90 ngày sau 90 ngày so với ngày tháng cho Hàm trả giá trị theo định dạng ngày tháng thời gian ANSI SQL 92 Cần phải biết chắn bạn muốn điều chỉnh giá trị Ví dụ, hầu hết trường hợp, giá trị "90 ngày " không giống với "3 tháng" Nếu bạn thay đổi câu hỏi thành tháng, đó, bạn có khả nhận tập hợp kết khác: SELECT date - MONTHS AS due_date, date AS cur_date, date + MONTHS AS past_due FROM aroma.period WHERE year = 2004 AND month = 'JAN'; Kết Due_Date Cur_Date Past_Due 2003-10-01 2004-01-01 2004-04-01 2003-10-02 2004-01-02 2004-04-02 2003-10-03 2004-01-03 2004-04-03 Những không ăn khớp trở nên khó hiểu bạn khơng cẩn thận Bạn cần phải ý đến trường hợp đặc biệt năm nhuận để bảo đảm chắn bạn nhận thông tin cần thiết Bạn điều chỉnh cách kết hợp giá trị, SELECT date - MONTHS - DAYS AS due_date, date AS cur_date, date + MONTHS + DAYS AS past_due FROM aroma.period WHERE year = 2004 AND month = 'JAN'; Kết Due_Date Cur_Date Past_Due 2003-09-27 2004-01-01 2004-04-05 2003-09-28 2004-01-02 2004-04-06 2003-09-29 2004-01-03 2004-04-07 Bạn điều chỉnh tương tự phần riêng lẻ kiểu liệu TIME (HOURS, MINUTES, và/ SECONDS) hay kiểu liệu TIMESTAMP (YEARS, MONTHS, DAYS, HOURS, MINUTES, và/ SECONDS) Để biết thêm thơng tin phép tính số học DATE, TIME, TIMESTAMP, xem SQL Reference Guide Sử dụng mệnh đề HAVING để loại trừ nhóm Câu hỏi Các sản phẩm có doanh thu tổng nhỏ USD 25.000 năm 2005? Ví dụ truy vấn SELECT prod_name, sum(dollars) AS total_sales 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 = 2005 GROUP BY prod_name HAVING sum(dollars) < 25000 ORDER BY total_sales DESC; Kết Prod_Name Total_Sales Aroma t-shirt 21397.65 Espresso Machine Royale 18119.80 Espresso Machine Italiano 17679.15 Coffee Sampler 16634.00 Tea Sampler 14907.00 Aroma baseball cap 13437.20 Aroma Sheffield Steel Teapot 8082.00 Spice Sampler 7788.00 Aroma Sounds CD 5937.00 Aroma Sounds Cassette 5323.00 French Press, 4-Cup 4570.50 Spice Jar 4073.00 French Press, 2-Cup 3042.75 Travel Mug 1581.75 Easter Sampler Basket 1500.00 Coffee Mug 1258.00 Christmas Sampler 1230.00 Điều kiện nhóm: mệnh đề HAVING Mặc dù việc phân chia liệu thành nhóm làm giảm lượng thơng tin trả về, truy vấn thường gửi nhiều thơng tin u cầu bạn Bạn sử dụng mệnh đề HAVING để loại trừ nhóm khơng thỏa mãn điều kiện rõ, ví dụ tổng số Đôla bé hay lớn số cho Truy vấn tính tốn tổng thu nhập bán hàng với sản phẩm năm 2005, giữ lại sản phẩm có tổng thu nhập $25.000 Cú pháp mệnh đề HAVING SELECT column name(s) FROM table name(s) [WHERE search_condition] [GROUP BY group_list] [HAVING condition] [ORDER BY order_list]; condition Một điều kiện SQL chứa hàm tập hợp Mệnh đề HAVING khác với mệnh đề WHERE mặt sau Mệnh đề WHERE Mệnh đề HAVING Làm việc theo hàng liệu trước tạo nhóm Làm việc theo tập hợp kết sau tạo nhóm Khơng thể biểu diễn điều kiện qua hàm tập hợp (ví dụ SUM hay AVG), sử dụng bí danh cột cho biểu thức khơng tập hợp Có thể biểu diễn điều kiện qua hàm tập hợp bí danh cột Các lưu ý cách dùng Bất kỳ hàm tập hợp sử dụng điều kiện mệnh đề HAVING Một truy vấn có mệnh đề HAVING phải chứa mệnh đề GROUP BY, trừ danh sách lựa chọn chứa hàm tập hợp Ví dụ: SELECT MIN(prodkey), MAX(classkey) FROM aroma.product HAVING MIN(prodkey) = 0; Tóm tắt Hướng dẫn phần loạt bài, mơ tả cách:  Sử dụng hàm SQL OLAP để thực phân tích liệu  Sử dụng hàm vơ hướng DATE phép tính số học DATE để tính tốn lấy thơng tin từ cột DATETIME Các hàm giải tích Các hàm SQL OLAP dùng để trả lời phạm vi rộng câu hỏi kinh doanh yêu cầu xếp hạng, tính tỷ lệ, tính tổng giá trị trung bình dịch chuyển, vân vân Các ví dụ hướng dẫn tập trung vào số tính tốn mà hàm OLAP xử lý Nói chung, hàm OLAP linh hoạt, làm đơn giản đáng kể câu lệnh SQL phức tạp mà bạn phải viết thiếu chúng ... Đối với sinh viên sử dụng tài liệu phần khoá học, nhận từ thầy hướng dẫn dẫn để kết nối tới sở liệu Aroma tìm hiểu khác biệt hướng dẫn cài đặt máy cục Hướng dẫn viết cho Express-C DB2 UNIX®, Linux®... tắt Hướng dẫn phần loạt bài, mơ tả cách:  Sử dụng hàm SQL OLAP để thực phân tích liệu  Sử dụng hàm vô hướng DATE phép tính số học DATE để tính tốn lấy thông tin từ cột DATETIME Các hàm giải tích. .. Về hướng dẫn Hướng dẫn mơ tả cách viết truy vấn có yêu cầu số cách phân tích liệu Nhiều câu hỏi có chứa tính tốn tuần tự, hay tính tốn hoạt động tập hợp có xếp thứ tự hàng, câu hỏi thường gặp phân

Ngày đăng: 11/05/2021, 04:54

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN