首页 > 解决方案 > 查找特定时期内的最大平均值,两张表

问题描述

我的任务听起来像这样:“选择 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

即使在这个阶段,这个结果似乎也不正确。请帮忙怎么做对吗?至少没有第二张桌子。

标签: sqljoinmax

解决方案


我相信您既需要 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'

推荐阅读