-- ****************************************************************************
-- Querying views defined over an OLAP cube
-- ****************************************************************************
-- Queries that mirror data selections shown in Building OLAP11g Cubes
-- These queries illustrate the following:
-- A) "Level" conditions are used to replace "group by".
-- B) Aggregation occurs in cube and respects cube aggregation rules.
-- C) No "sum/group by" is required for summary queries
-- D) OLAP calculations are simply selected as 'data columns'
-- ****************************************************************************
--
-- 1: Product and Sales are the only columns in query. "DEPARTMENT" is the
-- level name for Product. All other dimensions require an 'ALL' filter
-- in order to leverage aggregations in the Cube.
SELECT p.department_long_descript as dept,
s.sales
FROM PRODUCT_STANDARD_VIEW p,
SALES_CUBE_VIEW s
WHERE(p.dim_key = s.product
AND p.LEVEL_NAME = 'DEPARTMENT'
AND s.channel = 'ALL_CHANNELS'
AND s.geography = 'ALL_REGIONS'
AND s.time = 'ALL_YEARS');
-- ****************************************************************************
-- 2: Sales by Class (Channel), Department (Product), and Quarters in 2007.
-- A geography column is not in query, so the "ALL_REGIONS" condition
-- must be added in order to leverage aggregation over geography.
SELECT c.class_long_description as class,
p.department_long_descript as dept,
t.calendar_quarter_long_de as qtr,
round(s.sales) as sales
FROM channel_sales_channel_view c,
product_standard_view p,
geography_regional_view g,
time_calendar_view t,
sales_cube_view s
WHERE(c.dim_key = s.channel -- \
AND g.dim_key = s.geography -- Join Cube and
AND p.dim_key = s.product -- Dimension views
AND t.dim_key = s.TIME -- /
AND g.level_name = 'ALL_REGIONS' --> LEVEL_NAME can be used for "All" condition
AND c.level_name = 'CLASS' -- \
AND p.level_name = 'DEPARTMENT' -- "Level" conditions for other dims
AND t.level_name = 'CALENDAR_QUARTER' -- /
AND t.calendar_year_long_descr = 'CY2007') --> Time filtered for 2007 only
ORDER BY c.class_long_description, p.department_long_descript, t.end_date;
-- ****************************************************************************
-- 3: Add calculations to the previous query.
-- Calculations are exposed as columns and computed by the OLAP engine.
-- Query includes time series, year-to-date, and custom calculations
SELECT c.class_long_description as class,
p.department_long_descript as dept,
t.calendar_quarter_long_de as qtr,
round(s.sales) as sales, -- sales
round(s.SALES_YTD) as ytd, -- sales year to date (YTD)
round(s.SALES_YTD_PY_PCT_CHG, 2) as ytd_PY_pct_chg, -- sales YTD compared to last year
how_is_sales_ytd -- How is sales performing YTD (compared to last year)
FROM channel_sales_channel_view c,
product_standard_view p,
geography_regional_view g,
time_calendar_view t,
sales_cube_view s
WHERE(c.dim_key = s.channel
AND g.dim_key = s.geography
AND p.dim_key = s.product
AND t.dim_key = s.TIME
AND g.level_name = 'ALL_REGIONS'
AND c.level_name = 'CLASS'
AND p.level_name = 'DEPARTMENT'
AND t.level_name = 'CALENDAR_QUARTER'
AND t.calendar_year_long_descr = 'CY2007')
ORDER BY c.class_long_description, p.department_long_descript, t.end_date;
-- ****************************************************************************
-- 4: The cube/dimensions are represented as embedded totals. This makes it easy to
-- show multiple levels of aggregation at the same time using a simple query.
--
-- Here, we are showing different levels for time (month, quarter and year).
-- In this case, you select from the long description or short description
-- column instead of the dimension level description column. This is the only
-- other change required for the query - all the calculations work out perfectly.
SELECT c.long_description as channel,
p.long_description as product,
t.long_description as time,
round(s.sales) as sales,
round(s.SALES_YTD) as ytd,
round(s.SALES_YTD_PY_PCT_CHG, 2) as ytd_PY_pct_chg,
how_is_sales_ytd
FROM channel_sales_channel_view c,
product_standard_view p,
geography_regional_view g,
time_calendar_view t,
sales_cube_view s
WHERE(c.dim_key = s.channel
AND g.dim_key = s.geography
AND p.dim_key = s.product
AND t.dim_key = s.TIME
AND g.level_name = 'ALL_REGIONS'
AND c.level_name = 'CLASS'
AND p.level_name = 'DEPARTMENT'
AND t.long_description in ('CY2007', 'Q3-CY2007', 'Nov-2007'))
ORDER BY channel, product, t.end_date;
-- ****************************************************************************
-- 5: The dimension views also include special hierarchy columns that make it easy to
-- navigate the dimensions (e.g. drill down from 'All Years' to the 'Years' level.)
-- Use the "parent" column to drill down any type of of hierarchy:
-- level-based, ragged, skip-level or value-based.
--
-- The following query selects the "children" of "ALL_PRODUCTS" and "ALL_REGIONS"
-- by applying a condition on the parent columns.
-- Note that the Channel dimension is now removed from the results.
SELECT g.long_description as geography,
p.long_description as product,
t.long_description as time,
round(s.sales) as sales,
round(s.SALES_YTD) as ytd,
round(s.SALES_YTD_PY_PCT_CHG,2) as ytd_PY_pct_chg,
how_is_sales_ytd
FROM channel_sales_channel_view c,
product_standard_view p,
geography_regional_view g,
time_calendar_view t,
sales_cube_view s
WHERE(c.dim_key = s.channel
AND g.dim_key = s.geography
AND p.dim_key = s.product
AND t.dim_key = s.TIME
AND g.parent = 'ALL_REGIONS' --> The children of "ALL_REGIONS"
AND c.level_name = 'ALL_CHANNELS'
AND p.parent = 'ALL_PRODUCTS' --> The children of "ALL_PRODUCTS"
AND t.long_description in ('CY2007', 'Q3-CY2007', 'Nov-2007'))
ORDER BY geography, product, t.end_date;
-- ****************************************************************************
-- 6: Change the Time selection to a Parameterized "drill" using 'ALL_YEARS'
-- Channel is added back into the results, and Geography is removed.
-- Drill on Channel to return the children of 'ALL_CHANNELS'.
SELECT c.long_description as channel,
p.long_description as product,
t.long_description as time,
round(s.sales) as sales,
round(s.SALES_YTD) as ytd,
round(s.SALES_YTD_PY_PCT_CHG, 2) as ytd_PY_pct_chg,
how_is_sales_ytd
FROM channel_sales_channel_view c,
product_standard_view p,
geography_regional_view g,
time_calendar_view t,
sales_cube_view s
WHERE(c.dim_key = s.channel
AND g.dim_key = s.geography
AND p.dim_key = s.product
AND t.dim_key = s.TIME
AND c.parent = 'ALL_CHANNELS' -- The children of "ALL_CHANNELS"
AND g.level_name = 'ALL_REGIONS'
AND p.parent = 'ALL_PRODUCTS' -- The children of "ALL_PRODUCTS"
AND t.parent = nvl(:time_parent, 'ALL_YEARS'))
ORDER BY channel, product, t.end_date;