2003 7 12654.84
2003 8 17434.82
2003 9 19854.57
2003 10 21754.19
2003 11 13029.73
2003 12 10034.84
2004 1 12543.55
2 2003 1 1034.84
2 2003 2 1544.65
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
Расширенные запросы 249
2 2003 19 2754.19
2 2003 11 1329.73
2 2003 12 1034.84
2 2004 1 1293.55
Доступ к ячейкам с помощью цикла FOR
Можно получить доступ к ячейкам массива, используя для этого цикл FOR.
Следующее выражение устанавливает объем продаж за первые три месяца
2004 г. равным объему продаж за те же самые месяцы 2003 г., умноженному
на 1.25. Обратите внимание на использование цикла FOR и ключевого слова
INCREMENT, определяющего, на сколько должны быть увеличены значения
месяцев при каждой итерации цикла:
□ sales_amount[FOR month FROM 1 ТО 3 INCREMENT 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[F0R month FROM 1 TO 3 INCREMENT 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
2003 7 12654.84
2003 8 17434.82
2003 9 19854.57
2003 10 21754.19
2003 11 13029.73
2003 12 10034.84
2004 1 12543.55
2004 2 18930.81
2004 3 25172.29
2003 1 1034.84
2003 2 1544.65
250 Глава 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 1293.55
2 2004 2 1930.81
2 2004 3 2547.29
Обработка пустых и пропущенных значений
В этом разделе показывается, как с помощью фразы MODEL обрабатывать
пустые и пропущенные значения.
Использование IS PR E SE N T
Фраза IS PRESENT возвращает истинное значение (true), если строка, обозначенная
ссылкой на ячейку, существовала перед выполнением фразы
MODEL. Например:
□ sales_amount[CURRENTV(), 2003] IS PRESENT
возвратит true, если ячейка sales_amount[CURRENTV(), 2003] существует.
Следующее выражение устанавливает объемы продаж для первых трех
месяцев 2004 г. равными объемам продаж за соответствующие месяцы
2003 г., умноженным на 1.25:
□ sales_amount[F0R month FROM 1 ТО 3 INCREMERNT 1, 2004] =
CASE WHEN sales_amount[CURRENTV(), 2003] IS PRESENT THEN
ROUND(sales_amount[CURRENTV(), 2003] * 1.25, 2)
ELSE
0
END
Следующий запрос иллюстрирует применение этого выражения:
□ 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[F0R month FROM 1 TO 3 INCREMERNT 1, 2004] =
CASE WHEN sales_amount[CURRENTV(), 2003] IS PRESENT THEN
ROUND(sales_amount[CURRENTV(), 2003] * 1.25, 2)
ELSE
0
Расширенные запросы 251
END
) ORDER BY prd_type_id, year, month;
Выходные данные этого запроса в точности такие же, как и у предыдущего
запроса.
Использование PR E SE N T V ()
Функция PRESENTV(ячейка, выр_ 1, выр_2) возвращает выражение выр_1, если
обозначенная ссылкой ячейка строка существовала перед выполнением
фразы MODEL. Если же эта строка не существует, будет возвращено значение
выражения выр_2. Например:
П PRESENTV( SALES_AMOUNT[CURRENTV(), 2003],
ROUND(sales_amount[CURRENTV(), 2003] * 1.25, 2), 0)
возвратит округленное значение объема продаж, умноженное на 1.25, если
sales_amount[CURRENTV(), 2003] существует; в противном случае будет
возвращен 0.
Следующий запрос иллюстрирует применение этого выражения:
□ 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[F0R month FROM 1 TO 3 INCREMERNT 1, 2004] =
PRESENTV(SALES_AMOUNT[CURRENTV(), 2003],
ROUND(sales_amount[CURRENTV(), 2003] * 1.25, 2), 0)
) ORDER BY prd_type_id, year, month;
Использование PR E S E N T N N V ()
Функция PRESENTNNV(n4eilKa, выр_1, выр_2) возвращает значение выр_1,
если строка, обозначенная ссылкой ячейка, существовала перед выполнением
фразы MODEL и значение ячейки было непустым. Если строка не существовала
или значение ячейки оказывается пустым, возвращается значение
выр_2. Например:
□ PRESENTNNV( SALES_AM0UNT[CURRENTV(), 2003],
ROUND(sales_amount[CURRENTV(), 2003] * 1.25, 2), 0)
возвратит округленное значение объема продаж, умноженное на 1.25, если
sales_amount[CURRENTV(), 2003] существует и является непустым; в противном
случае будет возвращен 0.
Использование IG N O R E N A V и K EEP N A V
IGNORE NAV возвращает
■ 0 для пустых или пропущенных числовых значений
■ Пустую строку для пустых или пропущенных символьных значений