Читаем SQL: быстрое погружение полностью

Решение. Если мы просто ищем агрегатную функцию для одной страны, то можем выбрать страну, где был выставлен счет, и среднее значение от общей суммы, используя условие WHERE, чтобы ограничить наши результаты для одной страны — США.

SELECT

BillingCountry,

AVG(Total)

FROM

invoices

WHERE

BillingCountry = 'USA'

Рис. 140

Напоминание

Чтобы сократить количество возвращаемых знаков после запятой, мы можем использовать функцию ROUND() вне функции AVG().

Вопрос 3. Каков общий объем продаж компании за все время?

Решение. Поскольку в данном запросе задается общая сумма счетов, условие SELECT выглядит довольно просто:

SELECT

SUM(Total)

FROM

invoices

Рис. 141

Вопрос 4. Кто входит в десятку лучших клиентов с точки зрения совершенных ими покупок? Подсказка: чтобы ответить на этот вопрос, необходимо использовать соединение (глава 6).

Решение. Значение общей суммы найдено. Теперь необходимо отобразить первую десятку клиентов, приносящих наибольшую прибыль. Поскольку мы ищем данные из одной таблицы, которые соответствуют данным из другой таблицы во взаимно однозначном отношении, мы используем внутреннее соединение.

SELECT

SUM(Total)AS [Revenue Total],

c. FirstName,

c. LastName

FROM

invoices i

INNER JOIN

customers c

ON

i. CustomerId = c.CustomerId

GROUP BY c.CustomerId

ORDER BY SUM(Total) DESC

<p id="_16_xhtml_2523toc_marker_16_5"><strong>Глава 8. Контрольные вопросы</strong></p>

Вопрос 1. Сколько счетов превышает среднюю сумму счетов, выставленных в 2010 году?

Решение. Чтобы ответить на этот вопрос, необходимо решить две задачи. Во-первых, следует найти среднюю сумму счета-фактуры, сгенерированную в 2010 году. Во-вторых, необходимо сравнить это значение с каждым счетом в таблице, чтобы увидеть, сколько из них превышает среднюю стоимость счета-фактуры за 2010 год.

Сначала напишем следующий подзапрос:

select

avg(total)

from

invoices

where

InvoiceDate between '2010-01-01' and '2010-12-31'

В результате выполнения данного запроса мы получим среднее значение $5,80. Теперь необходимо написать внешний запрос для выбора счетов, превышающих средний показатель за 2010 год.

SELECT

InvoiceDate,

Total

FROM

invoices

WHERE

Total >

(SELECT

avg(total)

from

invoices

where

InvoiceDate between '2010-01-01' and '2010-12-31')

ORDER BY

Total DESC

Рис. 142

В результате выполнения данного запроса получено 179 строк.

Примечание

Если бы требовалось получить только фактическое количество возвращенных счетов-фактур, во внешнем запросе можно было бы изменить поле Total, указав COUNT(Total).

Вопрос 2. Какие клиенты получили эти счета?

Решение. Чтобы связать данные о клиентах из таблицы customers с таблицей invoices, необходимо использовать повторное объединение. Сам вопрос подразумевает однозначную связь между таблицей customers и таблицей invoices. Мы уже выбрали интересующие нас счета, поэтому теперь нам необходимо получить информацию о клиентах, которым были выставлены эти счета. При решении данного вопроса воспользуемся внутренним соединением. Это решение очень похоже на решение вопроса 1. Все, что мы добавили, — это раздел внутреннего соединения, поэтому у нас также имеется доступ к именам клиентов.

SELECT

i. InvoiceDate,

i. Total,

c. FirstName,

c. LastName

FROM

invoices i

INNER JOIN

customers c

ON

i. CustomerId = c.CustomerId

WHERE

Total >

(SELECT

avg(total)

from

invoices

where

InvoiceDate between '2010-01-01' and '2010-12-31')

ORDER BY

Total DESC

Вопрос 3. Сколько клиентов живут в США?

Решение. Мы можем изменить решение вопроса 2, включив оператор AND в конец условия WHERE внешнего запроса.

SELECT

InvoiceDate,

Total,

BillingCountry

FROM

invoices

WHERE

Total >

(SELECT

avg(total)

from

invoices

where

InvoiceDate between '2010-01-01' and '2010-12-31')

AND BillingCountry = 'USA'

ORDER BY

Total DESC

Рис. 143

В результате выполнения данного запроса получено 40 строк.

Примечание

При необходимости получения точного количества результатов можно использовать функцию SUM().

<p id="_16_xhtml_2523toc_marker_16_6"><strong>Глава 9. Контрольные вопросы</strong></p>

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

SELECT

BillingCity,

AVG(Total) AS [City Average],

(select

avg(total)

from

invoices) AS [Global Average]

FROM

invoices

GROUP BY

BillingCity

ORDER BY

BillingCity

Вопрос 1. Из запроса SELECT возьмите внутренний запрос и создайте из него представление. Сохраните его с именем V_GlobalAverage.

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

Решение. Во внутреннем запросе в первую строку добавим синтаксис представления.

CREATE VIEW V_GlobalAverage AS

select

avg(total)

from

invoices AS [Global Average]

Вопрос 2. Удалите подзапрос из приведенного выше кода и замените его вновь созданным представлением V_GlobalAverage.

Решение. При использовании представления в условии SELECT мы используем символ *.

SELECT

BillingCity,

AVG(Total) AS [City Average],

(select

*

from

V_GlobalAverage) AS [Global Average]

FROM

Перейти на страницу:

Все книги серии Библиотека программиста

Программист-фанатик
Программист-фанатик

В этой книге вы не найдете описания конкретных технологий, алгоритмов и языков программирования — ценность ее не в этом. Она представляет собой сборник практических советов и рекомендаций, касающихся ситуаций, с которыми порой сталкивается любой разработчик: отсутствие мотивации, выбор приоритетов, психология программирования, отношения с руководством и коллегами и многие другие. Подобные знания обычно приходят лишь в результате многолетнего опыта реальной работы. По большому счету перед вами — ярко и увлекательно написанное руководство, которое поможет быстро сделать карьеру в индустрии разработки ПО любому, кто поставил себе такую цель. Конечно, опытные программисты могут найти некоторые идеи автора достаточно очевидными, но и для таких найдутся темы, которые позволят пересмотреть устоявшиеся взгляды и выйти на новый уровень мастерства. Для тех же, кто только в самом начале своего пути как разработчика, чтение данной книги, несомненно, откроет широчайшие перспективы. Издательство выражает благодарность Шувалову А. В. и Курышеву А. И. за помощь в работе над книгой.

Чед Фаулер

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных