Программирование >>  Исключение дубликатов строк 

1 ... 132 133 134 [ 135 ] 136 137 138 ... 152


Customers.CustLastName AS CustFullName, SUMCEngagemervts.ContractPrice) AS TotalPrice

FROM Customers

INNER JOIN Engagements

ON Customers.customerlD Engagements.CustomerlD GROUP BY Customers.customerlD,

Customers.CustFirstName, Customers.CustLastName

Может показаться избыточным, но это - правильный способ решения!

Внимание! В некоторых системах баз данных требуется точно повторить выражения, используемые в условии SELECT, в условии GROUP BY. В качестве примеров можно привести Oracle и Microsoft Access. В приведенном выше запросе можно было бы выполнить:

GROUP BY Customers.customerlD Custome rs.CustFi rstName ] Customers.CustLastName

вместо перечисления отдельных столбцов. Это не соответствует стандарту SQL, но может оказаться, что это будет единственным способом заставить вашу

систему выполнить данный запрос.

Группиропоние вырожений

Мы уже приводили несколько правильных примеров создания выражений, которые не включали агрегатные функции. Одной из наиболее обычных ошибок является попытка объединения в группу по выражению, созданному в условии SELECT, вместо объединения по отдельным столбцам. Вспомните, что условие GROUP BY должно ссылаться на столбцы, созданные условиями FROM и WHERE. В нем нельзя использовать выражение, созданное в условии SELECT.

Рассмотрим еш,е ранее решенный пример чтобы показать вам, что имеется в виду, но в этот раз намеренно сделаем ошибку (а также пропустим этапы Преобразование и Уточнение , поскольку они уже рассматривались):

Show те for each customer in the state of Washington the customer full name, the customer full address, the latest contract date for the customer, and the total price of all the contracts . ( Показать для каждого клиента из штата Вашингтон полное имя клиента, полный адрес клиента, дату самого последнего контракта клиента и обилую стоимость всех контрактов .)

SQL SELECT Customers.CustLastName

Customers.CustFirstName AS CustomerFullName,



Custome rs.CustSt reetAdd ress

Customers.CustCity

Customers.CustState

Customers.CustZip AS CustomerFullAddress

MAX(Engagements.StartDate) AS LatestDate,

SUM (Engagements.ContractPrice)

AS TotalContractPrice FROM Customers INNER JOIN Engagements

ON Customers.CustomerlD = Engagements.CustomerlD

WHERE Customers.CustState = WA

GROUP BY CustomerFullame, CustomerFullAddress

Некоторые СУБД позволяют обойти это, но это неправильно. Столбцы CustomerFullName и CustomerFullAddress не существуют до тех пор, пока СУБД не вычислит условия FROM, WHERE и GROUP BY. Условие GROUP BY не обнаружит эти столбцы в результате, созданном в условиях FROM и WHERE, поэтому в системе базы данных, которая строго придерживается стандарта SQL, будет получена синтаксическая ошибка.

Для корректного способа решения необходимо перечислить в списке все столб-цы, используемые в выражениях CustomerFullName и CustomerFullAddress. Другой способ - заставить условие FROM сформировать вычисленные столбцы, используя вложенный табличный подзапрос. Вот как он может выглядеть:

SQL SELECT СЕ.CustomerFullName, СЕ.CustomerFullAddress,

МАХ(СЕ.StartDate) AS LatestDate, SUM(CE.ContractPrice) AS TotalContractPrice FROM

(SELECT Customers.CustLastName Customers.CustFirstName AS CustomerFullName, Custome rs.CustSt reetAdd ress Customers.CustCity Customers.CustState

Customers.CustZip AS CustomerFullAddress, Engagements.StartDate, Engagements.ContractPrice

FROM Customers

INNER JOIN Engagements

ON Customers.CustomenlD = Engagements.CustomerlD WHERE Customers.CustState = WA) AS CE

GROUP BY CE.CustomerFullName, CE.CustomerFullAddress



В данном случае это работает, поскольку столбцы CustomerFullName и Customer-FullAddress сформированы как вывод в условии FROM. Следует признать, тем не менее, что это очень усложняет запрос. По правде говоря, лучше просто перечислить в списке все отдельные столбцы, которые планируется использовать в не являюш,их-ся составными выражениях, чем пытаться сгенерировать выражения как столбцы в условии FROM.

ИспользоАОние GROUP BV

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

Показать каждого поставщика и среднее для поставщика количество дней на доставку товара .

Вывести на экран для каждого товара наименование товара и общий объем продаж .

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

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

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

Для закончившихся курсов лекций привести список по категории и по студенту для наименования категории, имени студента и среднего балла студента за все курсы лекций, взятые

из этой категории

наименованием

и количеством предложенных курсов лекций .

Привести список всех штатных сотрудников и количество курсов лекций, которые каоюдый из них запланировал прочитать .

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



1 ... 132 133 134 [ 135 ] 136 137 138 ... 152

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика