Как рассчитать несколько сумм и средних в одном запросе? - PullRequest
0 голосов
/ 10 марта 2019

Я нахожусь в классе SQL и борюсь с одним из вопросов.Мы используем базу данных AdventureWorksDW2014 в SQL Server, и вот проблема, на которой я застрял:

Напишите запрос, который вернет ключ сотрудника, имя, отчество, фамилию, общий объем продажи средняя сумма за продажу для каждого сотрудника, который совершил продажу посредникам.Все денежные значения должны быть округлены до двух десятичных знаков.Имена должны отображаться как одна запись как «Last, First Middle».Сортируйте результаты по общему объему продаж (сначала по наивысшему), затем по средней сумме за продажу (сначала по наивысшему), затем по имени сотрудника.

У меня нет проблем ни с выбором EmployeeKey, ни с использованием concat и форматированияимя в соответствии с инструкциями.После изучения данных становится ясно, что информация о сотруднике должна поступать из таблицы DimEmployee, а цифры продаж должны поступать из таблицы FactResellerSales, и я могу без проблем выполнить внутреннее соединение между таблицами.Я также знаю, как использовать функции sum и avg для вычисления общих и средних значений для сотрудников по отдельности, но они будут рассчитываться только для одного сотрудника за раз и возвращать только один результат.Часть, над которой я зациклен, - это создание столбцов для рассчитанных сумм и средних значений для каждого сотрудника.Результат, который мне нужен, должен иметь один столбец, в котором показаны общие продажи каждого сотрудника, и один столбец, в котором показана средняя сумма продаж для каждого сотрудника, а также другая информация, запрашиваемая для каждого сотрудника.До сих пор я запускал

select distinct EmployeeKey  
from FactResellerSales  

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

(select EmployeeKey, sum (SalesAmount) as TotalSalesByEmp, avg (SalesAmount) 
as AvgPerSaleByEmp  
from FactResellerSales  
where EmployeeKey = 272) 

, полагая, что, хотя выполнение 17 подзапросов заняло бы много времени, я мог бы в конечном итоге извлечь из них запрошенные данные в основной запрос, но я получил сообщение об ошибке «Msg 8120, уровень»16, состояние 1, строка 359. Столбец «FactResellerSales.EmployeeKey» недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY », когда я пытаюсь протестировать подзапрос.Но я не могу пропустить EmployeeKey, так как он мне нужен для поля связывания внутреннего соединения.На данный момент мой запрос (включая псевдонимы, которые я буду использовать для других полей, в зависимости от ситуации, в выражении «порядок по словам»):

USE AdventureWorksDW2014  
select e.EmployeeKey,  
    concat (e.LastName, ', ' + e.FirstName, ' ' + e.MiddleName) as EmployeeName  
from FactResellerSales as s  
inner join DimEmployee as e  
on s.EmployeeKey = e.EmployeeKey  
order by TotalSalesByEmp desc, AvgPerSaleByEmp desc, EmployeeName 

Мне просто нужно выяснить, как добавить два других поля.

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

| EmployeeKey | EmployeeName      | TotalSalesByEmp | AvgPerSaleByEmp |  
| 282         | Mitchell, Linda C | 10367007.43     | 1458.70         |  
| 283         | Carson, Jillian   | 10065803.54     | 1286.36         |  
| 281         | Blythe, Michael G | 9293903.01      | 1314.74         |  
| 272         | Jiang, Stephen Y  | 1092123.86      | 1378.94         | 

Пожалуйста, помогите.

1 Ответ

1 голос
/ 10 марта 2019

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

USE AdventureWorksDW2014

select e.EmployeeKey,  
       concat(e.LastName, ', ' + e.FirstName, ' ' + e.MiddleName) as EmployeeName, 
       sum(s.SalesAmount) as TotalSalesByEmp, 
       avg(s.SalesAmount) as AvgPerSaleByEmp 
from FactResellerSales as s  
inner join DimEmployee as e  
   on s.EmployeeKey = e.EmployeeKey  
group by e.EmployeeKey, 
         e.LastName, 
         e.FirstName, 
         e.MiddleName
order by TotalSalesByEmp desc, 
         AvgPerSaleByEmp desc, 
         EmployeeName
...