客户销售前2个月 - Oracle

时间:2017-11-30 18:15:04

标签: sql oracle aggregate-functions

我正在尝试开发一个查询,以按客户ID推出前2个月的销售额。这是一个示例表:

Customer_ID   Sales Amount    Period 
144567         40               2
234567         50               5
234567         40               7
144567         80               10
144567         48               2
234567         23               7

期望的输出将是

Customer_ID  Sales Sum   Period
144567       80           10
144567       48            2
234567       50            5
234567       40            7

我已经尝试了

select sum(net_sales_usd_spot), valid_period, customer_id
from sales_trans_price_output 
where valid_period in (select valid_period, sum(net_sales_usd_spot) 
                       from sales_trans_price_output 
                       where rank<=2)
group by valid_period, customer_id

错误是

  

太多的值ORA-00913。

我明白为什么,但不知道如何重做它。

4 个答案:

答案 0 :(得分:2)

尝试:

SELECT *
FROM (
  SELECT t.*,
         row_number() over (partition by customer_id order by sales_amount desc ) rn
  FROM sales_trans_price t
)
WHERE rn <= 2
ORDER BY 1,2 desc

演示:http://sqlfiddle.com/#!4/882888/3

答案 1 :(得分:1)

如果将where子句更改为:

,该怎么办?
where valid_period in
(
select p.valid_period from sales_trans_price_output p
join (select valid_period, sum(net_sales_usd_spot) 
                   from sales_trans_price_output 
                   where rank<=2) s on s.valid_period = p.valid_period
)

它可能很丑,需要重构,但我认为这是你追求的逻辑。

答案 2 :(得分:0)

错误是因为这个。

where valid_period in (select valid_period, sum(net_sales_usd_spot) 
                       from sales_trans_price_output 
                       where rank<=2)

子查询只能包含一个字段。

您使用rank走在正确的轨道上,但您可能没有正确使用它。 Google oracle rank可以找到正确的语法。

回到你想要实现的目标,派生表是我将使用的方法。这只是一个带别名的子查询。或者,如果您使用关键字with,则可能将其称为CTE - 计算表格表达式。

答案 3 :(得分:0)

试试吧

SELECT * FROM  (
      SELECT T.*,
             RANK () OVER (PARTITION BY CUSTOMER_ID 
                           ORDER BY VALID_PERIOD DESC) FN_RANK
      FROM SALES_TRANS_PRICE_OUTPUT  T
      ) A
WHERE A.FN_RANK <= 2
ORDER BY CUSTOMER_ID ASC, VALID_PERIOD DESC, FN_RANK DESC