PROD_NAME MONTH SALES_05 SALES

Một phần của tài liệu Hướng dẫn SQL & XQuery cho IBM DB2, Phần 5: So sánh dữ liệu pptx (Trang 30 - 35)

Lotta Latte FEB 3213.50 4239.50

Lotta Latte JAN 1611.00 3195.00

Lotta Latte MAR 2510.50 2980.50

Các tham khảo chéo với các biểu thức

Các tham khảo chéo trong các truy vấn phụ không chỉ hạn chế tới các tên cột đầy đủ; chúng có thể cũng là các biểu thức. Ví dụ, các biểu thức sau đây là các tham khảo chéo hợp lệ:

period.year-1 (previous year) period.quarter-1 (previous quarter)

Loại tham khảo chéo tổng quát hóa này làm đơn giản hóa việc thiết kế các công cụ ứng dụng phía khách.

Về truy vấn

Truy vấn này trả về doanh thu Lotta Latte hàng tháng ở San Jose trong ba tháng đầu tiên của cả năm 2005 lẫn 2004. Giải pháp tương quan là kết quả mong đợi có chứa dữ liệu cùng các tháng nhưng khác năm.

Mệnh đề FROM của truy vấn chính gán các tên tương quan cho tất cả các bảng có liên kết với nhau:

FROM aroma.store u, aroma.product q,

aroma.period e, aroma.sales l

Truy vấn phụ sau đó gắn việc thực hiện của nó với việc thực hiện truy vấn chính dựa vào các điều kiện sau trong mệnh đề WHERE:

d.year = e.year-1

p.prod_name = q.prod_name t.city = u.city

Do truy vấn chính lấy ra các hàng nên các giá trị của mỗi cột trong truy vấn cha mẹ có thể thay đổi, và các điều kiện tương quan truyền sự thay đổi này tới truy vấn phụ. Mối tham khảo chéo tới năm trước có dạng year-1 làm tổng quát hóa truy vấn phụ bằng cách loại bỏ một giá trị không đổi (2004).

Muốn thay đổi truy vấn để báo cáo theo các thời hạn năm khác, chỉ cần thay đổi ràng buộc về năm trong truy vấn chính.

Các lưu ý về cách dùng

Mỗi khi có thể, hãy tổng quát hóa các truy vấn phụ có tương quan và giảm thiểu sự tương tác của người sử dụng bằng cách dùng các tham khảo chéo dạng biểu thức.

Tính toán các tỷ lệ phần trăm của quý và năm

Câu hỏi

Các tổng số doanh thu hàng tháng trong quý đầu tiên của năm 2004 của các sản phẩm đã bán theo các túi một bảng ở San Jose là bao nhiêu? Tỷ lệ phần trăm của doanh thu mỗi tháng so với cả quý và so với cả năm là bao nhiêu?

Ví dụ truy vấn

SELECT pj.prod_name, dj.month, SUM(dollars) AS mon_sales_04,

DEC(100 * DEC(SUM(dollars))/ (SELECT SUM(si.dollars) FROM aroma.store ri,

aroma.sales si, aroma.product pi, aroma.period di

WHERE si.storekey = ri.storekey AND si.classkey = pi.classkey AND si.prodkey = pi.prodkey AND si.perkey = di.perkey AND di.qtr = dj.qtr

AND di.year = dj.year

AND pi.prod_name = pj.prod_name AND pi.pkg_type = pj.pkg_type

AND ri.city = rj.city), 7, 2) AS pct_qtr1, DEC(100 * DEC(SUM(dollars))/

(SELECT SUM(si.dollars) FROM aroma.store ri, aroma.sales si, aroma.product pi, aroma.period di

WHERE si.storekey = ri.storekey AND si.classkey = pi.classkey AND si.prodkey = pi.prodkey AND si.perkey = di.perkey

AND di.year = dj.year

AND pi.prod_name = pj.prod_name AND pi.pkg_type = pj.pkg_type AND ri.city = rj.city), 7, 2) AS pct_yr FROM aroma.store rj,

aroma.sales sj, aroma.product pj, aroma.period dj

WHERE sj.storekey = rj.storekey AND sj.classkey = pj.classkey AND sj.prodkey = pj.prodkey AND sj.perkey = dj.perkey AND rj.city = 'San Jose' AND dj.year = 2004 AND dj.qtr = 'Q1_04'

AND pkg_type = 'One-pound bag'

GROUP BY pj.prod_name, dj.month, dj.qtr, dj.year, pj.pkg_type, rj.city

ORDER BY pj.prod_name, pct_qtr1 desc;

Kết quả

Một phần của tài liệu Hướng dẫn SQL & XQuery cho IBM DB2, Phần 5: So sánh dữ liệu pptx (Trang 30 - 35)