【问题标题】:How do I calculate multiple sums and averages in a single query?如何在单个查询中计算多个总和和平均值?
【发布时间】:2019-03-09 21:14:06
【问题描述】:

我正在上 SQL 课程,正在努力解决其中一个问题。我们在 SQL Server 中使用 AdventureWorksDW2014 数据库,这是我遇到的问题:

编写一个查询,该查询将返回向经销商进行销售的每个员工的员工键、名字、中间名、姓氏、总销售额和每次销售的平均金额。所有货币值应四舍五入到小数点后两位。姓名应显示为“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, Level 16, State 1, Line 359 当我尝试测试子查询时,选择列表中的“FactResellerSales.EmployeeKey”列无效,因为它既不包含在聚合函数也不包含在 GROUP BY 子句中。但我不能省略 EmployeeKey,因为我需要它内部连接的链接字段。到目前为止,我的查询(包括我将在 order by 语句中用于其他字段的别名)是:

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         | 

请帮忙。

【问题讨论】:

  • 到目前为止你有没有尝试过?如果没有,你做了什么研究?如果您阅读过What topics can I ask about here?,您会注意到它建议您也发布您的工作摘要。即使您没有完成这项工作的查询,也请向我们展示您到目前为止所写的内容。示例数据和您期望的结果(不是图像)在这里也会有所帮助,但我们确实需要先看看您的工作。谢谢。
  • @Larnu 编辑了我的问题,以展示我到目前为止所做的工作和这些努力的结果,以及我需要的结果示例。如果只是对这些事情的描述不充分,我深表歉意,我只是不明白本网站上帖子的格式,这就是为什么我最初只给出描述。

标签: sql sql-server sum average


【解决方案1】:

只需使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多