
- •ГЛАВА 7 Команды
- •Обзор
- •alter database
- •alter role
- •alter table
- •begin...end
- •begin transaction
- •break
- •case
- •checkpoint
- •close
- •coalesce
- •commit
- •compute
- •connect to...disconnect
- •continue
- •create database
- •create default
- •create existing table
- •create function (SQLJ)
- •create index
- •create plan
- •create procedure
- •create procedure (SQLJ)
- •create proxy_table
- •create role
- •create rule
- •create schema
- •create table
- •create trigger
- •create view
- •dbcc
- •deallocate cursor
- •declare
- •declare cursor
- •delete
- •delete statistics
- •disk init
- •disk mirror
- •disk refit
- •disk reinit
- •disk remirror
- •disk unmirror
- •drop database
- •drop default
- •drop function (SQLJ)
- •drop index
- •drop procedure
- •drop role
- •drop rule
- •drop table
- •drop trigger
- •drop view
- •dump database
- •dump transaction
- •execute
- •fetch
- •goto label
- •grant
- •if...else
- •insert
- •kill
- •load database
- •load transaction
- •lock table
- •nullif
- •online database
- •open
- •order by
- •prepare transaction
- •quiesce database
- •raiserror
- •readtext
- •reconfigure
- •remove java
- •reorg
- •return
- •revoke
- •rollback
- •rollback trigger
- •save transaction
- •select
- •setuser
- •shutdown
- •truncate table
- •union
- •update
- •update all statistics
- •update partition statistics
- •update statistics
- •waitfor
- •where
- •while
- •writetext

|
|
ГЛАВА 7 Команды |
|
|
|
|
|
compute |
|
|
|
Описание |
Формирует итоговые значения, которые выводятся как дополнительные |
||
|
строки в результатах запроса. |
||
Синтаксис |
начало_оператора_select |
||
|
compute строка_агрегат (имя_столбца) |
||
|
|
[, строка_агрегат(имя_столбца)]... |
|
|
[by имя_столбца [, имя_столбца]...] |
||
Параметры |
строка_агрегат |
||
|
Одна из следующих функций: |
||
|
Функция |
Значение |
|
|
|
|
|
|
sum |
Сумма значений в (числовом) столбце |
|
|
|
|
|
|
avg |
Среднее значений в (числовом) столбце |
|
|
|
|
|
|
min |
Наименьшее значение в столбце |
|
|
|
|
|
|
max |
Наибольшее значение в столбце |
|
|
|
|
|
|
count |
Количество значений в столбце |
|
|
|
|
|
|
имя_столбца |
||
|
Имя столбца. Оно должно быть заключено в круглые скобки. Функции |
||
|
sum и avg можно использовать только для столбцов с числовыми зна- |
||
|
чениями. |
||
|
Одна инструкция compute может содержать несколько агрегатных |
||
|
функций, вычисляемых по одному и тому же набору столбцов |
||
|
(см. примеры 2 и 3). Чтобы создать несколько групп, нужно |
||
|
использовать несколько инструкций compute (см. пример 5). |
||
|
by |
|
|
|
Задает подгруппы, по которым вычисляются агрегатные значения. |
||
|
Для каждого набора строк, для которых значения в столбцах, указан- |
||
|
ных после ключевого слова by, одинаковы, генерируется новая строка |
||
|
с агрегатным значением. Если используется ключевое слово by, то |
||
|
необходимо также указать инструкцию order by. |
||
|
Если после ключевого слова by перечислены несколько элементов, то |
||
|
группа разбивается на подгруппы и функция применяется на каждом |
||
|
уровне группировки. |
||
Примеры |
Пример 1. |
Вычисление суммы цен книг, которые стоят больше $12 для |
|
|
каждого типа кулинарных книг (то есть книг, для которых значение в |
||
|
столбце type заканчивается на “cook”): |
select type, price from titles
327

compute
where price > $12
and type like "%cook" order by type, price
compute sum(price) by type
type |
price |
--------- |
------------ |
mod_cook |
19.99 |
|
sum |
|
------------ |
|
19.99 |
type |
price |
--------- |
------------ |
trad_cook |
14.99 |
trad_cook |
20.95 |
|
sum |
|
------------ |
|
35.94 |
(5 rows affected)
Пример 2. Вычисление суммы цен и авансов для книг, которые стоят больше $12, для каждого типа кулинарных книг:
select type, price, advance from titles
where price > $12
and type like "%cook" order by type, price
compute sum(price), sum(advance) by type
type |
price |
advance |
--------- |
--------- |
------------ |
mod_cook |
19.99 |
0.00 |
|
sum |
sum |
|
--------- |
------------ |
|
19.99 |
0.00 |
type |
price |
advance |
--------- |
--------- |
------------ |
trad_cook |
14.99 |
8,000.00 |
trad_cook |
20.95 |
7,000.00 |
|
sum |
sum |
|
--------- |
------------ |
|
35.94 |
15,000.00 |
(5 rows affected)
328

ГЛАВА 7 Команды
Пример 3. Вычисление суммы цен и максимального аванса для книг, которые стоят больше $12, для каждого типа кулинарных книг:
select type, price, advance from titles
where price > $12
and type like "%cook" order by type, price
compute sum(price), |
max(advance) by type |
|
type |
price |
advance |
--------- |
--------- |
------------- |
mod_cook |
19.99 |
0.00 |
|
sum |
|
|
--------- |
|
|
19.99 |
|
|
|
max |
|
|
------------- |
|
|
0.00 |
type |
price |
advance |
--------- |
--------- |
------------- |
trad_cook |
14.99 |
8,000.00 |
trad_cook |
20.95 |
7,000.00 |
|
sum |
|
|
--------- |
|
35.94
max
-------------
8,000.00
(5 rows affected)
Пример 4. Разбивка данных на подгруппы по значениям столбцов type и pub_id и вычисление суммы цен на книги по психологии (то есть книги, для которых столбец type равен “psychology”) для каждой подгруппы:
select type, pub_id, price from titles
where price > $10
and type = "psychology" order by type, pub_id, price
compute sum(price) by type, pub_id
type |
pub_id |
price |
------------ |
--------- ----------- |
|
psychology |
0736 |
10.95 |
psychology |
0736 |
19.99 |
|
|
sum |
|
|
--------- |
329

compute
|
|
30.94 |
type |
pub_id |
price |
------------ |
--------- |
--------- |
psychology |
0877 |
21.59 |
|
|
sum |
|
|
--------- |
|
|
21.59 |
(5 rows affected) |
|
Пример 5. Вычисление суммы цен всех книг по психологии, которые стоят больше $10, а также сумм в подгруппах с одинаковыми значениями столбцов type и pub_id:
select type, pub_id, price from titles
where price > $10
and type = "psychology"
order by type, pub_id, |
price |
||
compute |
sum(price) by |
type, pub_id |
|
compute |
sum(price) by |
type |
|
type |
|
pub_id |
price |
------------ |
--------- |
--------- |
|
psychology |
0736 |
10.95 |
|
psychology |
0736 |
19.99 |
|
|
|
|
sum |
|
|
|
--------- |
|
|
|
30.94 |
type |
|
pub_id |
price |
------------ |
--------- |
--------- |
|
psychology |
0877 |
21.59 |
|
|
|
|
sum |
---------
21.59
sum
---------
52.53
(6 rows affected)
Пример 6. Вычисление суммы цен и суммы авансов всех кулинарных книг, которые стоят больше $10:
select type, price, advance from titles
where price > $10
and type like "%cook" compute sum(price), sum(advance)
330

|
|
ГЛАВА 7 Команды |
|
|
|
type |
price |
advance |
--------- |
----------- |
-------------- |
mod_cook |
19.99 |
0.00 |
trad_cook |
20.95 |
8,000.00 |
trad_cook |
11.95 |
4,000.00 |
trad_cook |
14.99 |
7,000.00 |
|
sum |
sum |
|
----------- |
-------------- |
|
67.88 |
19,000.00 |
(5 rows affected)
Пример 7. Вычисление суммы цен на кулинарные книги и сумм выражений, включающих эти цены:
select type, price, price*2 from titles
where type like "%cook" compute sum(price), sum(price*2)
type |
price |
|
------------ -------------- |
------------ |
|
mod_cook |
19.99 |
39.98 |
mod_cook |
2.99 |
5.98 |
trad_cook |
20.95 |
41.90 |
trad_cook |
11.95 |
23.90 |
trad_cook |
14.99 |
29.98 |
|
sum |
sum |
|
============= |
============ |
|
70.87 |
141.74 |
Использование |
• Инструкция compute позволяет просмотреть строки данных и |
итоговые строки в одном наборе результатов. При помощи этой инструкции можно вычислять итоговые значения для нескольких подгрупп и несколько агрегатов для одной группы.
• Инструкцию compute можно использовать без ключевого слова by для вычисления общих итогов. В этом случае инструкция order by необязательна. См. пример 6.
• Если указана инструкция compute by, то необходимо также указать инструкцию order by. После инструкции compute by должны быть перечислены те же столбцы, что и после инструкции order by, или их подмножество. При этом столбцы в инструкции compute by долж- ны располагаться в том же порядке слева направо, начинаться с того же выражения, ни одно выражение не должно быть пропущено. На- пример, если инструкция order by имеет вид order by a, b, c, то допустимо использовать следующие инструкции compute by:
331

compute
compute by a, b, c compute by a, b compute by a
Ограничения
•В инструкции compute нельзя указывать более 127 столбцов для вычисления агрегатных функций.
•Инструкцию compute нельзя использовать в объявлении курсора.
•Можно вычислять итоговые значения и для выражений, и для столб- цов. Все выражения и столбцы, указанные в инструкции compute, должны быть указаны и в списке выборки.
•Не допускается указывать псевдонимы столбцов в качестве аргумен- тов агрегатных функций в инструкции compute, хотя псевдонимы можно указывать в списке выборки select, в инструкции order by
ив инструкции by, являющейся частью инструкции compute.
•Нельзя указывать инструкцию select into в том же операторе, что
иинструкцию compute, поскольку операторы, которые содержат compute, не создают обычные таблицы.
•Если инструкция compute содержит инструкцию group by, то должны быть выполнены следующие условия:
•инструкция compute может содержать не более 255 агрегатов;
•инструкция group by должна содержать не более 255 столбцов.
•Столбцы, включенные в инструкцию compute, не должны быть длиннее 255 байтов.
Результаты выполнения инструкции compute выдаются в виде новой строки или строк.
•Агрегатные функции обычно вычисляют одно значение для всех выбранных строк таблицы или для каждой группы, и эти итоговые значения отображаются как новые столбцы. Например:
select type, sum(price), sum(advance) from titles
where type like "%cook" |
|
|
group by type |
|
|
type |
|
|
------------- |
--------- |
---------- |
mod_cook |
22.98 |
15,000.00 |
trad_cook |
47.89 |
19,000.00 |
(2 rows affected)
332

ГЛАВА 7 Команды
•Инструкция compute позволяет извлекать строки данных и форми- ровать итоговые строки в одной команде. Например:
select type, price, advance from titles
where type like "%cook" order by type
compute sum(price), sum(advance) by type
type |
price |
advance |
---------- |
---------- |
---------------- |
mod_cook |
2.99 |
15,000.00 |
mod_cook |
19.99 |
0.00 |
Compute Result: |
|
|
---------------------- |
|
----------------- |
|
22.98 |
15,000.00 |
type |
price |
advance |
---------- |
---------- |
---------------- |
trad_cook |
11.95 |
4,000.00 |
trad_cook |
14.99 |
8,000.00 |
trad_cook |
20.95 |
7,000.00 |
Compute Result: |
|
|
---------------------- |
|
----------------- |
|
47.89 |
19,000.00 |
(7 rows affected) |
|
•В таблице 7-4 описана группировка различных типов инструкций compute и формат выводимых ею данных.
Таблица 7-4. Инструкции compute by и строки данных
Инструкции и группировка |
Формат выводимых |
Примеры |
|
данных |
|
|
|
|
Одна инструкция compute, одна и та |
Одна строка данных |
1, 2, 4, 6, 7 |
же функция |
|
|
|
|
|
Одна инструкция compute, разные |
Одна строка данных на каждый |
3 |
функции |
тип функции |
|
Несколько инструкций compute, |
Одна строка данных на каждую |
одинаковые группируемые столбцы |
инструкцию compute; строки |
|
данных в выводе собраны вместе |
Тот же результат, что и при использовании одной инст- рукции compute с разными функциями
Несколько инструкций compute, |
Одна строка данных на каждую 5 |
разные группируемые столбцы |
инструкцию compute; строки |
|
данных расположены в разных |
|
местах, в зависимости от |
|
группировки |
|
|
333

compute
Чувствительность к регистру
•Если на сервере используется порядок сортировки без учета регистра, то инструкция compute не учитывает регистр данных в указанных столбцах. Например, получив следующие данные:
select * from groupdemo
lname |
amount |
---------- |
------------------ |
Smith |
10.00 |
smith |
5.00 |
SMITH |
7.00 |
Levi |
9.00 |
Lйvi |
20.00 |
инструкция compute by по столбцу lname выдаст следующий результат:
select lname, amount from groupdemo order by lname
compute sum(amount) by lname lname amount
---------- ------------------------
Levi |
9.00 |
Compute Result:
------------------------
|
9.00 |
lname |
amount |
---------- |
------------------------ |
Lйvi |
20.00 |
Compute Result:
------------------------
20.00
lname |
amount |
---------- |
------------------------ |
smith |
5.00 |
SMITH |
7.00 |
Smith |
10.00 |
Compute Result:
------------------------
22.00
334

|
ГЛАВА 7 Команды |
|
|
Тот же запрос на сервере, не учитывающем ригистр символов и |
|
диакритические знаки, дает следующий результат: |
|
lname |
amount |
---------- |
------------------------ |
Levi |
9.00 |
Lйvi |
20.00 |
Compute Result: |
|
------------------------ |
|
|
29.00 |
lname |
amount |
---------- |
------------------------ |
smith |
5.00 |
SMITH |
7.00 |
Smith |
10.00 |
Compute Result: |
|
------------------------ |
|
|
22.00 |
Стандарты |
Уровень соответствия стандарту SQL92: расширение Transact-SQL. |
См. также |
Команды group by и having, select |
|
Функции avg, count, max, min, sum |
335