Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
80
Добавлен:
10.05.2015
Размер:
4.94 Mб
Скачать

 

 

ГЛАВА 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

Соседние файлы в папке БД задание ко 2 лабе и методичка