1

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

事实表

  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 行。我需要这方面的指导。谢谢。

4

2 回答 2

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

请注意,如果任何月份的最高销售额出现平局,则此查询将显示该月的所有最高销售额。换句话说,如果产品代码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
于 2013-07-29T18:08:20.967 回答
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
;
于 2013-07-29T18:20:05.563 回答