【问题标题】:Date Interval SQL日期间隔 SQL
【发布时间】:2021-04-04 07:36:46
【问题描述】:

我有一个包含货运数据的数据库。我正在尝试获取平均运费最高的三个船舶国家。我只想使用最近 12 个月的订单数据,使用 Orders 表中的最后一个订单日期作为结束日期。 Orders 表的前 10 个条目是:

我无法弄清楚如何为开始日期创建条件。我写的查询是:

SELECT ShipCountry, ROUND(AVG(Freight),2) AS AverageFreight
FROM [dbo].[Orders]
WHERE YEAR(OrderDate) < YEAR(MAX(OrderDate)) 
GROUP BY ShipCountry
ORDER BY AverageFreight DESC

我在这个查询中遇到的错误是:

聚合可能不会出现在 WHERE 子句中,除非它出现在 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。

更新

我使用以下查询解决了这个问题:

SELECT TOP 3 ShipCountry, ROUND(AVG(Freight), 2) AS AverageFreight
FROM [dbo].[Orders]
WHERE OrderDate >= (SELECT DATEADD(mm,-12,(SELECT MAX(OrderDate) FROM [dbo].[Orders]))) 
GROUP BY ShipCountry
ORDER BY AverageFreight DESC

【问题讨论】:

  • 您可以编辑您的问题并将您的查询作为您自己的答案。
  • 我删除了不一致的数据库标签。请仅使用您真正使用的数据库进行标记。
  • 请不要将您的解决方案放在您的问题中。添加答案并自我接受。
  • 当然!我会解决的!

标签: sql sql-server datetime aggregate-functions date-arithmetic


【解决方案1】:

您可以使用窗口函数来做到这一点:

SELECT ShipCountry, ROUND(AVG(Freight),2) AS AverageFreight
FROM (SELECT o.*, MAX(OrderDate) OVER() as MaxOrderDate FROM [dbo].[Orders] o) o
WHERE OrderDate >= DATEADD(year, -1, MaxOrderDate) 
GROUP BY ShipCountry
ORDER BY AverageFreight DESC

【讨论】:

    【解决方案2】:

    我使用以下查询解决了这个问题:

    SELECT TOP 3 ShipCountry, ROUND(AVG(Freight), 2) AS AverageFreight
    FROM [dbo].[Orders]
    WHERE OrderDate >= (SELECT DATEADD(mm,-12,(SELECT MAX(OrderDate) FROM [dbo].[Orders]))) 
    GROUP BY ShipCountry
    ORDER BY AverageFreight DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 2021-07-21
      相关资源
      最近更新 更多