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,