我正在尝试开发一个查询,以按客户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。
我明白为什么,但不知道如何重做它。
答案 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
答案 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