按月销售产品 - SQL

时间:2013-07-29 17:46:10

标签: sql oracle data-warehouse

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

事实表

  1. 销售
  2. 尺寸

    1. 供应商
    2. 产品
    3. 时间(范围为一年)
    4. 商店
    5. 我想查询哪个产品按月销售最多,我的意思是输出就像

      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;
      

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

2 个答案:

答案 0 :(得分:2)

您的查询有一些没有意义的事情,例如:

  • 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

请注意,如果任何月份的最高销售额达到平局,此查询将显示该月的所有最高销售额。换句话说,如果1月份产品代码AAAABBBB与最高销售额相关联,则两种产品的查询结果都会有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

答案 1 :(得分:1)

您可以使用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
;