【问题标题】:SQL SUM and Average Sale by YearsSQL SUM 和平均销售额(按年份)
【发布时间】:2016-04-25 20:49:08
【问题描述】:

我有一张记录每月销售额的表格。表格示例见图片。

所以这个数据是部分的,自 2000 年以来,我每年都有 1-12 个月。我通常会像这样查询任何一年的总销售额:

SELECT SUM(total_sales) as TotalSalesYear FROM sales_report WHERE year =  '2008'

我在这里要做的是确定销售额最高的年份和自 2000 年以来每年的平均销售额。所以我需要每年做一个 SUM,并确定哪一年是最高的。然后,一旦我有了每年的 SUM,我就可以得出平均每年的销售额。

我只是不确定如何查询。

谢谢。

【问题讨论】:

  • 在询问 SQL 问题时,您应该始终标记您的 DBMS。 SQL 方言不同。适用于一种 DBMS 的方法不一定适用于另一种。

标签: sql


【解决方案1】:

按年分组以获得每年的结果记录。按销售额降序排列,并将结果限制为 1 行,这样您就可以得到销售额最高的年份。

此外,我们使用AVG 的分析版本来获得每年记录的所有总和的平均值(我们最后只显示一个)。从查询中删除最后一行(即 fetch only 子句),看看它是如何工作的。

select 
  year, 
  sum(total_sales) as sum_of_year, 
  avg(sum(total_sales)) over () as avg_sum
from sales_report 
group by year
order by sum(total_sales) desc
fetch first 1 row only;

SQL 小提琴:http://sqlfiddle.com/#!15/fee30/5

这是标准 SQL,但不适用于每个 DBMS。一些 DBMS 更符合标准,而另一些则更少。有些人使用TOPLIMIT 或其他东西来仅获得第一行。有些甚至没有分析功能。

【讨论】:

  • 谢谢托尔斯滕。那行得通(有点)。我想修改如下。正如您在上表中看到的那样,我每年都有几个月。您的查询适用于日历年(即 1 月至 12 月)。我需要按财政年度去。我们的财政实际上是从 7 月到 6 月(例如:2010 年 7 月到 2011 年 6 月。所以同样的想法,除了我需要为每年定义从 6 月到 7 月的“年份”,谢谢。
  • 因此,例如,2011 年的前六个月属于 2010 财年。这意味着对于第 1 个月到第 6 个月,我们必须从一年中减去 1,仅此而已:将 year 替换为year - case when month <= 6 then 1 else 0 end 在查询中。一些 DBMS 甚至允许您创建函数,因此您可以编写一个函数 fiscal_year(year, month) 以使其更具可读性。或者,如果您的 DBMS 提供,您可以在表中包含会计年度的计算列。
【解决方案2】:
  select rank()over (  order by total_sale) rnk,
 year, total_sale, avg_sale
    from (select year, 
sum(total_sales) total_sale,
 avg(total_sales) avg_sale
 from sales_report group by year)

此查询提供每年的排名。 rnk=1 是销售额最高的年份。通过说rnk=1,可以得到销售额最高的当年的总销售额和平均销售额。希望这会有所帮助!

【讨论】:

    【解决方案3】:

    这是您问题第二部分的解决方案。这将计算所有年份的平均销售额:

    SELECT avg(sum_sales) 
    FROM (
          SELECT year as year, sum(total_sales) as sum_sales     
            FROM sales 
        GROUP BY year
    ) AS T;
    

    为了获得销售额最高的年份,您可以使用 order by 和 limit 进行扩展,如下所示:

    SELECT year, sum_sales   
      FROM ( 
           SELECT year as year, sum(total_sales) as sum_sales            
             FROM sales        
            GROUP BY year) AS T 
     ORDER BY sum_sales desc 
     LIMIT 1;
    

    【讨论】:

    • 所以只是为了确认平均查询,这仍然会先按年份获得 SUM,然后再取平均值?例如,最早的年份是 1992 年一直到 2015 年。这将首先取 1992 年、1993 年一直到 2015 年的 SUM。然后对所有 23 年求和除以 23 得到自 1992 年以来的平均年销售额?
    • 是的,完全正确。它首先按年计算总和,然后对所有这些总和求平均值。我也喜欢 Thorsten 的解决方案,它一口气就能得到结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多