Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按月份划分的产品销售额-SQL_Sql_Oracle_Data Warehouse - Fatal编程技术网

按月份划分的产品销售额-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的
      是什么?是否应该是产品销售部的
    也就是说,如果您需要每月的最大产品销售额,并且需要包含产品代码(或电影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
    
    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个查询。再次感谢。