Выбрать главу

g. GenreId = t.GenreId

Глава 7. Контрольные вопросы

Вопрос 1. Создайте однострочный список рассылки для всех клиентов из США, включая полные имена, написанные заглавными буквами, и полные адреса с пятизначными почтовыми индексами, в следующем формате:

FRANK HARRIS 1600 Amphitheatre Parkway, Mountain View, CA 94043

Решение. В приведенном выше формате имя и фамилия должны быть написаны в верхнем регистре, поэтому для этих двух полей мы воспользуемся функцией UPPER(). Для объединения остальных полей используем символ ||, добавляя, где необходимо, пробелы и запятые.

SELECT

UPPER(FirstName) || ' ' || UPPER(LastName) || ' '

|| Address || ', ' || City || ', ' || State || ' '

|| SUBSTR(PostalCode,1,5) AS [MailingAddress]

FROM

customers

WHERE

Country = 'USA'

Рис. 139

Вопрос 2. Каковы средние годовые продажи клиентам из США согласно имеющимся данным за все годы?

Решение. Если мы просто ищем агрегатную функцию для одной страны, то можем выбрать страну, где был выставлен счет, и среднее значение от общей суммы, используя условие 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

Глава 8. Контрольные вопросы

Вопрос 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,