【问题标题】:Product sales by month - SQL按月计算的产品销售额 - SQL
【发布时间】:2013-07-29 17:46:10
【问题描述】:

我刚刚创建了一个包含以下详细信息的小型数据仓库。

事实表

  1. 销售

尺寸

  1. 供应商
  2. 产品
  3. 时间(范围为一年)
  4. 商店

我想查询哪个产品的月销量最高,我的意思是输出是这样的

Month - Product Code - Num_Of_Items
JAN      xxxx            xxxxx
FEB      xxxx            xxxxx

我尝试了以下查询

with product_sales as(
SELECT dd.month,
  fs.p_id,
  dp.title,
 SUM(number_of_items) Num
FROM fact_sales fs
INNER JOIN dim_products dp
ON fs.p_id = dp.p_id
INNER JOIN dim_date dd
ON dd.date_id = fs.date_id
GROUP BY dd.month,
  fs.p_id,
  dp.title
)
select distinct month,movie_id,max(num) 
from product_sales 
group by movie_id,title, month;

我有 132 条记录,而不是最多 12 行。我需要这方面的指导。谢谢。

【问题讨论】:

  • 如果您需要“每月”一行,为什么要GROUP BY除了月份之外的其他任何内容?
  • 我认为如果我们使用聚合函数,那么我们需要这样做。

标签: sql oracle data-warehouse


【解决方案1】:

您的查询有几处没有意义,例如:

  • movie_id 来自哪里?
  • 什么是from abc?应该是from product_sales

也就是说,如果您需要按月的最大产品销售额并且您需要包含产品代码(或电影 ID 或其他),您需要一个分析查询。你的会是这样的:

WITH product_sales AS (
  SELECT
    dd.month,
    fs.p_id,
    dp.title,
   SUM(number_of_items) Num,
   RANK() OVER (PARTITION BY dd.month ORDER BY SUM(number_of_items) DESC) NumRank
  FROM fact_sales fs
  INNER JOIN dim_products dp ON fs.p_id = dp.p_id
  INNER JOIN dim_date dd ON dd.date_id = fs.date_id
  GROUP BY dd.month, fs.p_id, dp.title
)
SELECT month, p_id, title, num
FROM product_sales
WHERE NumRank = 1

请注意,如果任何月份的最高销售额相同,则此查询将显示该月的所有最高销售额。换句话说,如果产品代码 AAAABBBB 与 1 月份的最高销售额并列,则查询结果将有两个产品的 1 月份行。

如果即使出现平局,您每月也只想要一排,请使用ROW_NUMBER 而不是RANK(),但请注意ROW_NUMBER 将任意选择获胜者,除非您定义了平局。例如,要让最低的p_id 成为决胜局,请像这样定义NumRank 列:

ROW_NUMBER() OVER (
  PARTITION BY dd.month
  ORDER BY SUM(number_of_items) DESC, p_id
) NumRank

【讨论】:

  • 真的很抱歉。粘贴后稍微更改了查询。
  • 不用担心 - 我想这就是发生的事情,因为我自己做了很多 :)
  • 非常感谢。我刚刚根据您所说的逻辑创建了 12 个查询。再次感谢。
【解决方案2】:

您可以使用 MAX () KEEP (DENSE_RANK FIRST ORDER BY ) 选择最大值为 num 的 movie_id

...
select 
   month, 
   MAX(movie_id) KEEP (DENSE_RANK FIRST  order by num desc) as movie_id, 
   MAX(num)
from 
 abc
group by month
;

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2023-01-19
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多