按月份划分的产品销售额-SQL
我刚刚创建了一个包含以下详细信息的小型数据仓库 事实表按月份划分的产品销售额-SQL,sql,oracle,data-warehouse,Sql,Oracle,Data Warehouse,我刚刚创建了一个包含以下详细信息的小型数据仓库 事实表 销售 尺寸 供应商 产品 时间(范围为一年) 商店 我想查询哪个产品的月销售量最大,我指的是产量 Month - Product Code - Num_Of_Items JAN xxxx xxxxx FEB xxxx xxxxx 我尝试了以下查询 with product_sales as( SELECT dd.month, fs.p_id, dp.title, S
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行。我需要这方面的指导。谢谢。关于您的查询,有几点没有意义,例如:
来自哪里movie\u id
- abc的
是什么?是否应该是产品销售部的
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
ROW_NUMBER() OVER (
PARTITION BY dd.month
ORDER BY SUM(number_of_items) DESC, p_id
) NumRank
请注意,如果某个月的销售额最高,则此查询将显示该月的所有销售额最高。换句话说,如果产品代码AAAA
和BBBB
与1月份的销售额持平,那么查询结果将在1月份为这两种产品生成一行
如果即使平局,您也希望每月只有一行,请使用row\u NUMBER
而不是RANK()
,但请注意,row\u NUMBER
将任意选择赢家,除非您定义平局打破者。例如,要使最低的p_id
成为联系断路器,请如下定义NumRank
列:
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
ROW_NUMBER() OVER (
PARTITION BY dd.month
ORDER BY SUM(number_of_items) DESC, p_id
) NumRank
您可以使用MAX()KEEP(densite_RANK FIRST ORDER BY)选择最大值为num的电影id
...
select
month,
MAX(movie_id) KEEP (DENSE_RANK FIRST order by num desc) as movie_id,
MAX(num)
from
abc
group by month
;
如果你需要“每月”一行,为什么你要按其他任何东西分组,而不是按月份分组?我认为如果我们使用聚合函数,那么我们需要这样做。真的很抱歉。粘贴后稍微更改了查询。不用担心-我想是这样的,因为我自己已经做了很多了:)非常感谢。我刚刚根据你说的逻辑创建了12个查询。再次感谢。