|
Программирование >> Исключение дубликатов строк
Поскольку Д/1Я отображения полного имени клиента требуется два столбца, оба они должны быть включены в условие GROUP BY. Запомните, что если некоторый столбец, который не является результатом агрегатного вычисления, нужно включить в вывод, то он обязательно должен также быть включен в условие GROUP BY. Столбец ContractPrice не был включен в условие GROUP BY, потому что этот столбец используется во многих выражениях в агрегатных функциях. Если бы ContractPrice был включен, то были бы получены отдельные группы клиентов и цен. MIN, МАХ и AVG - все возвратят эту сгруппированную цену. COUNT будет больше единицы, только если у данного клиента имеется более одного контракта с той же самой ценой. Тем не менее группирование по клиенту и цене и запрос функции COUNT будет хорошим способом поиска клиентов, у которых есть несколько контрактов с одинаковой ценой. Смешивание столбцов и вырожений Предположим, нам нужен список имен клиентов как один столбец вывода, полный адрес клиента как второй столбец вывода, дата последнего ангажемента и сумма цен контрактов ангажемента. Полное имя клиента находится в двух столбцах: CustFirstName и CustLastName. Для задания полного адреса требуются столбцы CustStreetAddress, CustState, CustCity и CustZipCode. Рассмотрим, как построить SQL для этого запроса (он сохранен в учебной базе данных под именем Customers Last Booking). Show те for each customer the customer full name, the customer full address, the latest contract date for the customer, and the total price of all the contracts . ( Показать для каоюдого клиента полное имя клиента, полный адрес клиента, дату последнего контракта клиента и общую сумму всех контрактов .) Преобразование: Select customer last name and customer first name as customer full name; street address, city, state, and zipcode as customer full address; the latest contract start date; and the sum of the contract price from the customers table joined with the engagements table on customer ID, grouped by customer last name, customer first name, customer street address, customer city, customer state, and customer zip code (Выбрать фамилию и имя клиента как полное имя клиента; улицу, город, штат и почтовый индекс как полный адрес клиента; дату начала последнего контракта; сумму цены контракта из таблицы Клиенты , соединенной с таблицей Ангажементы по идентификатору клиента, сгруппированные по фамилии клиента, имени клиента, улице клиента, городу клиента, штату клиента и почтовому коду клиента) Уточнение Select customer last name ttne customer first name as customer full name; street address, 4 9 city. ( 9 state, afte zipcode as customer full address; the latest MAX(contract start date) as latest date;, and the sum tri the (contract price) from the customers table joined with the engagements table on customer ID, grouped by customer last name, customer first name, customer street address, customer city, customer state, me customer zip code (Выбрать фамилию клиента имя клиента как полное имя клиента, улицу город штат J у почтовый индекс как полный адрес клиента, МАХ(дата начала) как последнюю дату, сумму (цена контракта) как обшую цену контракта из Клиенты , соединенной с Ангажементы по идентификатору клиента, сгруппированные по фамилии клиента, имени клиента, улице клиента, городу клиента, штату клиента, почтовому коду клиента) SELECT Customers.CustLastName Customers.CustFirstName AS CustomerFullName Custome rs.CustSt reetAdd ress Customers.CustSity Customers.CustState Customers.CustZipCode AS CustomerFullAddress MAX(Engagements.StartDate) AS LatestDate SUM(Engagements.Cent ractP rice), AS TotalContractPrice FROM Customers INNER JOIN Engagements ON Customers.CustomerlD = Engagements.CustomerlD GROUP BY Customers.CustLastName, Customers.CustFirstName, Customers.CustStreetAddress, Customers.CustSity, Customers.CustState Customers.CustZipCode Здесь требуется перечислить все и каждый из столбцов, используемых в выходном выражении, которое не включает агрегатную функцию. Столбцы StartDate и ContractPrice использовались в составных выражениях, поэтому не требуется перечислять их в условии GROUP BY. Фактически не имеет смысла группировать их как по StartDate, так и по ContractPrice, потому что мы хотим использовать их в составных вычислениях по нескольким клиентам. Если, например, выполнить объединение в группу по StartDate, то МАХ(StartDate) возвратит значение группирования, а SUM(ContractPrice) возвратит только сумму цен контрактов для клиента по любой указанной дате. Вы получите сумму лишь одного контракта, если только у клиента не имеется более одного контракта на указанную дату - что маловероятно. Использование GROUP BV в подзапросе условия ШН€П€ Рассмотрим запрос, который требует использования как подзапроса с агрегатной функцией, так и условия GROUP BY в этом подзапросе: Display the engagement contract whose price is greater than the sum of all contracts for any other customer , ( Вывести на экран контракт ангажемента, цена которого больше суммы всех конщрактов для любого другого клиента .) Преобразование: Select customer first name, customer last name, engagement start date, and engagement contract price from the customers table joined with the engagements table on customer ID where the contract price is greater than the sum of all contract prices for customers other than the current customer, grouped by customer ID (Выбрать имя клиента, фамилию клиента, дату начала ангажемента и стоимость контракта ангажемента из таблицы Клиенты , соединенной с таблицей Ангажементы по идентификатору клиента, где цена контракта больше суммы всех цен контрактов для других клиентов, иных, чем текуш.ии клиент, сгруппированные по идентификатору клиента) Уточнение: Select customer first name, customer last name, engagement start date, mi engagement contract price from the customers Шt joined with the engagements table on customer ID where the contract price is greater thdft > ALL (SELECT the sum of all contract prices fef customers ID <> other than the current customer ID, grouped by customer ID) (Выбрать имя клиента, фамилию клиента, дату начала ангажемента, стоимость контракта ангажемента из Клиенты , соединенной с Ангажементы по идентификатору клиента, где цена контракта > всех (Выбрать сумму цен контрактов по идентификатору клиентов о идентификатор иного клиента, сгруппированные по идентификатору клиента)) SQL SELECT Customers.CustFirstName, Customers.CustLastName, Engagements.StartDate, Engagements.ContractPrice FROM Customers INNER JOIN Engagements ON Customers.customerlD = Engagements.CustomerlD
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |