sql - 查找特定时期内的最大平均值,两张表
问题描述
我的任务听起来像这样:“选择 2013 年 5 月销售额高于每个销售区域的平均月销售额的销售区域(名称)(使用 SalesTerritory、SalesHeader 表)。” 据我了解,从逻辑上讲,我需要找到 2013 年 5 月的最大平均值,同时我需要链接两个表(“salesterritory”表中的“name”字段,第二个中的其余数据,但“名称”必须存在)。我试图将任务分成几部分,并通过没有名称的 id 找到至少一个区域,这是我的代码:
SELECT TerritoryID, MAX(avga.sal)
from (select YEAR(OrderDate) AS 'Year', MONTH(OrderDate) AS 'Month', TerritoryID, AVG(TotalDue) AS 'sal'
FROM Sales.SalesOrderHeader
GROUP BY YEAR(OrderDate), MONTH(OrderDate), TerritoryID
having YEAR(OrderDate)=2013) as avga
group by TerritoryID
即使在这个阶段,这个结果似乎也不正确。请帮忙怎么做对吗?至少没有第二张桌子。
解决方案
我相信您既需要 2013 年 5 月的每个地区的平均值,也需要同一个月所有地区的平均值。请注意OVER()
下面查询中的使用。此子句允许计算多行的平均值,这在这种情况下是理想的,因为我们只需要返回那些其数字高于整体平均值的地区。
select
yyyy
, mm
, TerritoryID
, territory_av
, month_av
from (
SELECT
yyyy
, mm
, TerritoryID
, territory_av
, AVG(av_value) OVER() month_av
FROM (
SELECT
YEAR(OrderDate) AS yyyy
, MONTH(OrderDate) AS mm
, TerritoryID
, AVG(TotalDue) AS territory_av
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) = 2013
AND MONTH(OrderDate) = 5
GROUP BY
YEAR(OrderDate)
, MONTH(OrderDate)
, TerritoryID
) AS derive1
) AS derive2
) AS derive3
WHERE territory_av > month_av
;
不要having
用作where
. 用于where
过滤表数据,减少由 处理的数据group by
。用于having
过滤在group by
.
关于 2013 年 5 月的过滤,在 where 子句中不使用数据函数来帮助过滤会更有效。选择日期范围的更通用方法(不需要通过函数更改数据)如下所示:
WHERE OrderDate >= '2013-05-01'
AND OrderDate < '2013-06-01'
日期的语法因数据库而异,您可能需要将日期文字转换为日期(或时间戳)
WHERE OrderDate >= to_date('2013-05-01','yyyy-mm-dd')
AND OrderDate < to_date('2013-06-01','yyyy-mm-dd')
或者,在 SQL Server 中,您可以使用:
WHERE OrderDate >= '20130501'
AND OrderDate < '20130601'
推荐阅读
- r - 尝试在 heroku 上部署闪亮的 Web 应用程序时,应用程序与 buildpack 不兼容
- java - 谷歌云 K8s 集群中的 Spring Java 资源安全
- ios - 有什么方法可以通过 UIImagePIcker 只选择“JPG”、“PNG”和“JPEG”图像
- kubernetes - 即使创建 pvc,也未安装卷
- php - 表单不使用 ajax 和 php 提交?
- excel - 如何创建 Python 代码以从 Excel 文件中读取数据并创建 XML 文件
- javascript - 减少文本输入字段中 parseFloat 值的小数位数
- javascript - 如何在 HTML 上为特定 id 设置计时器
- javascript - 检查和查看源代码中的不同源代码
- visual-studio-2017 - 如何在应用程序启动时删除“使用一个组件弹出激活许可证结果”(仅适用于其他人,但对我来说很好)?