Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Конспект (Архитектуры обработки данных + SQL).doc
Скачиваний:
74
Добавлен:
10.12.2013
Размер:
336.9 Кб
Скачать
      1. Запросы с группировкой (предложениеGroup by)

Итоговые запросы напоминают итоговую информацию, находящуюся обычно в конце отчета. Эти запросы «сжимают» подробные данные, содержащиеся в отчете, в одну строку итоговых результатов. Но, как известно, в отчетах иногда используются также промежуточные итоги. И точно так же бывает необходимо получать промежуточные итоги результатов запроса. Эту возможность предоставляет предложение GROUP BY .

Вычислить оборот за каждый день в течение месяца.

SELECT ДАТА_ДОК, SUM (КОЛ-ВО*ЦЕНА)

FROM ПЕРЕМЕЩЕНИЕ

WHERE ДАТА_ДОК BETWEEN ‘1.01.2000’ AND ’31.01.2000’

GROUP BY ДАТА_ДОК

ORDER BY ДАТА_ДОК

Какова средняя цена для каждой материальной ценности.

SELECT IDN_МАТ.ЦЕН, AVG(ЦЕНА)

FROM ПЕРЕМЕЩЕНИЕ

GROUP BY IDN_МАТ.ЦЕН

Как это видно из приведенных примеров, в предложении GROUP BY обязательно перечисляются те поля, которые в списке возвращаемых столбцов указываются без агрегатных функций, то есть по этим полям производится группировка.

      1. Условия поиска групп having

Точно также, как предложение WHERE используется для отбора отдельных строк, участвующих в запросе, предложение HAVING можно применить для отбора групп строк. Его формат соответствует формату предложения WHERE. Предложение HAVING состоит из ключевого слова HAVING, за которым следует условие поиска. Таким образом, данное предложение определяет условие поиска для групп. Основным отличием предложения HAVING от WHERE, что оно применяется уже непосредственно после самого запроса и в условие поиска включается поле с примененной к нему агрегатной функцией.

Вывести те дни месяца, когда оборот превышал 1000 руб.

SELECT ДАТА_ДОК, SUM (КОЛ-ВО*ЦЕНА)

SUM (КОЛ-ВО*ЦЕНА)

FROM ПЕРЕМЕЩЕНИЕ

WHERE ДАТА_ДОК BETWEEN ‘1.01.2000’ AND ’31.01.2000’

GROUP BY ДАТА_ДОК

HAVING SUM (КОЛ-ВО*ЦЕНА)>1000

Вывести все идентификаторы городов, если количество клиентов из них больше трех.

SELECT IDN_ГОРОДА

FROM КЛИЕНТ

GROUP BY IDN_ГОРОДА

HAVING COUNT(*) >3

    1. Работа с несколькими таблицами

На практике многие запросы считывают данные сразу из нескольких таблиц базы данных. Например, у нас существуют две таблицы.

Таблица Города

IDN

НАЗВАНИЕ

100

102

103

105

Москва

Санкт-Петербург

Пермь

Париж

Таблица Клиент

IDN

НАЗВАНИЕ(ИМЯ)

IDN_ГОРОДА

1

2

3

4

5

МММ

Хопер

Алиса

ИВС

ПГТУ

100

100

102

103

103

Вывести всех клиентов с указанием города.

SELECT ГОРОДА.НАЗВАНИЕ, КЛИЕНТ.НАЗВАНИЕ(ИМЯ)

FROM ГОРОДА,КЛИЕНТ

WHERE ГОРОДА.IDN=КЛИЕНТ.IDN_ГОРОДА

Результат этого запроса.

Москва

Москва

Санкт-Петербург

Пермь

Пермь

МММ

Хопер

Алиса

ИВС

ПГТУ

Если бы нам нужны были клиенты только из Москвы. То этот запрос дополнился бы еще одной строкой.

AND ГОРОДА.НАЗВАНИЕ =’Москва’

В качестве упрощенного варианта этот же запрос можно записать следующим образом.

SELECT Г.НАЗВАНИЕ, К.НАЗВАНИЕ(ИМЯ)

FROM ГОРОДА Г., КЛИЕНТ К.

WHERE Г.IDN=K.IDN_ГОРОДА AND Г.НАЗВАНИЕ=’Москва’

Нас интересует на какую сумму был оборот по каждой группе товаров за какой-то промежуток времени.

SELECT ГР.НАЗВАНИЕ, SUM(П.КОЛ-ВО*П.ЦЕНА)

FROM ГРУППЫ ГР., ПЕРЕМЕЩЕНИЕ П.

WHERE ГР.IDN=П.IDN_ГРУППЫ AND П.ДАТА_ДОК

BETWEEN ‘1.02.2000’ AND ’16.03.2000’

GROUP BY ГР.НАЗВАНИЕ

HAVING SUM(П.КОЛ-ВО*П.ЦЕНА)>1000

ORDER BY SUM(П.КОЛ-ВО*П.ЦЕНА)

Соседние файлы в папке Программирование