Oracle Quarter SQL Query与前三个产品

时间:2016-01-07 11:54:57

标签: oracle

我正在开发Oracle的一个小项目。我需要获得前三名最畅销的产品以及今年和四月至六月,七月至九月,十月至十二月和一月至三月四个季度中每一季的总销售额。我已经找到了第一部分,我只需要帮助获得每个产品的4季度总计。希望有人可以提供帮助,谢谢

这是到目前为止使用的SQL命令:

select * from (
  select   "FACTQUANTITY"."PRODUCTID" as "PRODUCTID",
           "DIMPRODUCT"."PRODUCTNAME" as "PRODUCTNAME",
           sum(FACTQUANTITY.QUANTITY) as "QUANTITY" 
  from     "FACTQUANTITY" "FACTQUANTITY",
           "DIMPRODUCT" "DIMPRODUCT" 
  where    "DIMPRODUCT"."PRODUCTID"="FACTQUANTITY"."PRODUCTID" 
  group by FACTQUANTITY.PRODUCTID,
           DIMPRODUCT.PRODUCTNAME
  order by sum(FACTQUANTITY.QUANTITY) desc
)
WHERE ROWNUM <= 3; 

enter image description here

2 个答案:

答案 0 :(得分:2)

你可以从这里开始:

  select     
     trunc(fact_table.date_column,'Q') as quarter,
    "FACTQUANTITY"."PRODUCTID" ,
    "DIMPRODUCT"."PRODUCTNAME",
     sum(FACTQUANTITY.QUANTITY) as "QUANTITY" 
  from   "FACTQUANTITY" JOIN "DIMPRODUCT" 
       ON "DIMPRODUCT"."PRODUCTID"="FACTQUANTITY"."PRODUCTID" 
  group by 
      FACTQUANTITY.PRODUCTID, DIMPRODUCT.PRODUCTNAME,   trunc(fact_table.date_column,'Q')

    ;

随后,你可以:

with a as (<previous query>)
select * 
from (
  select 
       quarter, 
       productid, 
       productname, 
       quantity,
       row_number() over (partition by quarter order by quantity desc) rnk
  from a
  )
where rnk <= 3;

答案 1 :(得分:0)

SELECT *
FROM   (
  SELECT *,
         ROW_NUMBER() OVER ( PARTITION BY quarter
                             ORDER BY quantity DESC, PRODUCTNAME ASC ) AS rn
  FROM   (
    SELECT   TRUNC( f.datetime, 'Q' ) AS quarter,
             f.PRODUCTID,
             d.PRODUCTNAME,
             sum(f.QUANTITY) AS QUANTITY
    FROM     FACTQUANTITY f
             INNER JOIN
             DIMPRODUCT d
             ON ( d.PRODUCTID = f.PRODUCTID )
    GROUP BY TRUNC( f.datetime, 'Q' ),
             FACTQUANTITY.PRODUCTID,
             DIMPRODUCT.PRODUCTNAME
  )
)
WHERE rn <= 3;