本教程將引導您掌握 Oracle Database 10g 中 SQL MODEL 子句的核心功能,學習如何在 SQL 查詢中定義多維陣列並套用規則進行跨行計算。預計學習時間約 30 分鐘,涵蓋從基礎語法到進階應用的完整主題:
SQL MODEL 子句將查詢結果轉換為多維陣列,包含三大元素:
規則以維度值表達計算邏輯,支援萬用字元與 FOR 迴圈,將複雜的試算表運算內建於資料庫,大幅提升效能、擴展性與管理性,避免資料外移至 Excel 等工具。
使用 SH 範例結構描述,建立 sales_view 視圖,彙總各國產品年度銷售額與筆數:
CREATE VIEW sales_view AS
SELECT country_name country, prod_name prod, calendar_year year,
SUM(amount_sold) sale, COUNT(amount_sold) cnt
FROM sales, times, customers, countries, products
WHERE sales.time_id = times.time_id
AND sales.prod_id = products.prod_id
AND sales.cust_id = customers.cust_id
AND customers.country_id = countries.country_id
GROUP BY country_name, prod_name, calendar_year;
驗證視圖共 3,219 筆記錄,並確認物化視圖已啟用查詢重寫以優化效能。
SELECT SUBSTR(country,1,20) country, SUBSTR(prod,1,15) prod, year, sales
FROM sales_view
WHERE country IN ('Italy','Japan')
MODEL RETURN UPDATED ROWS
PARTITION BY (country)
DIMENSION BY (prod, year)
MEASURES (sale sales)
RULES (
sales['Bounce', 2002] = sales['Bounce', 2001] + sales['Bounce', 2000],
sales['Y Box', 2002] = sales['Y Box', 2001],
sales['2_Products', 2002] = sales['Bounce', 2002] + sales['Y Box', 2002]
)
ORDER BY country, prod, year;
關鍵點:
RETURN UPDATED ROWS 僅回傳新增或更新的列(此處為 2002 年預測值)。sales['Bounce', 2002])可插入新儲存格;符號引用(如 sales[prod='Bounce', year>2000])僅能更新既有儲存格。需搭配聚合函數(MAX、SUM 等)將多值化為單值:
sales['Bounce', 2005] = 100 + MAX(sales)['Bounce', year BETWEEN 1998 AND 2002]
CV() 可在規則右側取得左側當前的維度值,實現跨列同期計算:
sales['Bounce', year BETWEEN 1995 AND 2002] =
sales['Mouse Pad', CV(year)] + 0.2 * sales['Y Box', CV(year)]
亦可運算:CV(year)-1 存取前一年資料。ANY 通配符則代表該維度所有值,簡化規則撰寫。
以簡潔語法建立多個預測年份:
sales[FOR prod IN ('Bounce','Y Box'), FOR year IN (2002 TO 2005)] = 0
支援 INCREMENT、FROM ... TO 等多種生成模式。
IGNORE NAV 忽略 NULL 度量,或 KEEP NAV 保留 NULL;UNIQUE SINGLE REFERENCE / UNIQUE DIMENSION 控制單元格唯一性。ITERATE(n) + UNTIL),適用遞迴計算(如複利、階乘)。ORDER BY 子句可指定規則內儲存格處理順序,確保相依計算正確。SQL MODEL 將試算表級的跨行運算納入資料庫核心,以宣告式 SQL 取代程序式邏輯,兼顧效能與維護性,是資料倉庫與複雜報表的利器。