предсказанные результаты за первые три месяца 2004 г. (которые для наглядности
выделены полужирным шрифтом):
□ PRD_TYPE_ID YEAR MONTH SALES_AM0UNT
1 2003 1 10034.84
1 2003 2 15144.65
1 2003 3 20137.83
1 2003 4 25057.45
1 2003 5 17214.56
1 2003 6 15564.64
1 2003 7 12654.84
1 2003 8 17434.82
1 2003 9 19854.57
1 2003 10 21754.19
1 2003 11 13029.73
1 2003 12 10034.84
1 2004 1 10034.84
1 2004 2 35282.48
1 2004 3 25172.29
2 2003 1 1034.84
2 2003 2 1544.65
246 Глава 7
2 2003 3 2037.83
2 2003 4 2557.45
2 2003 5 1714.56
2 2003 6 1564.64
2 2003 7 1264.84
2 2003 8 1734.82
2 2003 9 1854.57
2 2003 19 2754.19
2 2003 11 1329.73
2 2003 12 1034.84
2 2004 1 1034.84
2 2004 2 3582.48
2 2004 3 2547.29
Использование позиционной и символической нотаций для обращения
к ячейкам
В предыдущем примере было показано, как получить доступ к ячейке массива,
используя следующую нотацию: sales_amount[l, 2004], в которой 1
обозначает месяц, а 2004 - год. Такое обращение принято называть позиционной
нотацией, поскольку смысл размерностей определяется их положением
в списке; в первой позиции содержится месяц, а во второй - год.
Кроме того, можно использовать так называемую символическую нотацию
для явного указания смысла размерностей, например: sales_
amount [month=l, year=2004]. Ниже приводится предыдущий запрос, переписанный
с применением символической нотации:
□ SELECT prd_type_id, year, month, sales_amount
FROM a ll_ s a le s
WHERE prd_type_id BETWEEN 1 AND 2
AND emp_id = 21
MODEL
PARTITION BY (p rd _typ e _id )
DIMENSION BY (month, year)
MEASURES (amount sales_amount) (
sales_amount[month=1, year=2004] = sales_amount[month=1, year=2003],
sales_amount[month=2, year=2004] =
sales_amount[month=2, year=2003] + sales_amount[month=3, year=2003],
sales_amount[month=3, year=2004] =
R0UND(sales_amount[month=3, year=2003] * 1.25, 2)
) ORDER BY prd_type_id, year, month;
Единственное различие между позиционной и символической нотациями
состоит в том, как они обрабатывают пустые значения. Выражение
sales_amount[NULL, 2003] возвращает объем продаж, для которого месяц
имеет пустое значение (NULL), а год равен 2003, а вот sales_
amount [month=NULL, уеаг=2004] не возвращает никакого допустимого значения,
так как выражение NULL=NULL всегда имеет значение false.
Расширенные запросы 247
Получение доступа к диапазону ячеек с использованием фраз
BETWEEN и AND
Можно получить доступ к целому диапазону ячеек, используя для этого
ключевые слова BETWEEN и AND. Например, следующее выражение устанавливает
объем продаж за январь 2004 г. равным округленному среднему по
продажам с января по март 2003 г.:
□ sales_amount[1, 2004] =
R0UND(AVG(sales_amount) [month BETWEEN 1 AND 3, 2003], 2)
Ниже показано применение этого выражения:
□ SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id BETWEEN 1 AND 2
AND emp_id = 21
MODEL
PARTITION BY(prd_type_id)
DIMENSION BY (month, year)
MEASURES (amount salesr_amount) (
sales_amount[1, 2004] =
R0UND(AVG(sales_amount) [month BETWEEN 1 AND 3, 2003], 2)
)
ORDER BY prd_type_id, year, month;
Получение доступа ко всем ячейкам с помощью ANY и IS ANY
Можно обратиться ко всем ячейкам сразу, используя предикаты ANY и IS
ANY. Предикат ANY используется при применении позиционной нотации, а
IS ANY - при применении символической нотации. Следующее выражение
устанавливает объем продаж за январь 2004 г. равным округленной сумме
объемов продаж за все годы и все месяцы:
□ sales_amount[1, 2004] =
R0UND(SUM(SALES_AM0UNT) [ANY, year IS ANY], 2)
Следующий запрос иллюстрирует применение этого выражения:
□ SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id BETWEEN 1 AND 2
AND emp_id = 21
MODEL
PARTITION BY(prd_type_id)
DIMENSION BY (month, year)
MEASURES (amount sales_amount) (
sales_amount[1, 2004] =
ROUND( SUM(SALES_AM0UNT) [ANY, year IS ANY], 2)
) ORDER BY prd_type_id, year, month;
248 Глава 7
Получение текущего значения размерности с помощью функции
CURRENTVO
Текущее значение размерности можно получить, используя функцию
CURRENTV(). Следующее выражение устанавливает объем продаж за январь
2004 г. равным объему продаж за тот же самый месяц 2003 г., умноженному
на 1.25. Обратите внимание на использование функции CURRENTVO для получения
текущего месяца, который равен 1 :
□ sales_amount[1, 2004] =
ROUND(sales_amount{CURRENTV(), 2003] * 1.25, 2)
Следующий запрос иллюстрирует применение этого выражения:
□ SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id BETWEEN 1 AND 2
AND emp_id = 21
MODEL
PARTITION BY(prd_type_id)
DIMENSION BY (month, year)
MEASURES (amount sales^amount) (
sales_amount[1, 2004] =
ROUND(sales_amount{CURRENTV(), 2003] * 1.25, 2)
) ORDER BY prd_type_id, year, month;
Выходные данные этого запроса имеют следующий вид (значения для
2004 г. выделены полужирным шрифтом):
□ PRD_TYPE_ID YEAR MONTH SALES_AM0UNT
2003 1 10034.84
2003 2 15144.65
2003 3 20137.83
2003 4 25057.45
2003 5 17214.56
2003 6 15564.64