当满足多个条件时,如何将它们分组以计算平均值

时间:2019-01-23 05:41:51

标签: sql oracle aggregate-functions unpivot

我正在使用Oracle数据库,并希望计算不同地区的平均产品价格。

示例:

prod,amt,price
X,100,1
X,180,2
X,250,3
Y,90,2
Y,170,3
Y,280,3

这里的产品X在一个地区的售价为100,而在另一个地区的售价为180。

现在,对于某些分析,它们被分为不同的重叠的范围,我需要根据范围计算价格平均值

必需的输出是

prod,rang(Amt),mean(price),
X,[0-200],1.5,
X,[150-300],2.5,
Y,[0-200],2.5,
Y,[150-300],3,

请注意,范围很多,为清楚起见,我只给出了2个。

我尝试如下进行操作,但是case匹配第一个条件,并且只为[0-200]给出了一个X值,我需要2个记录

select prod, amt, price, 
case 
when amt between 0 and 200 then amt
when amt between 150 and 300 then amt
end as rng
from tablea

如何在case语句中获取2条匹配记录?

2 个答案:

答案 0 :(得分:2)

您可以使用 public function up() { Schema::create('companies', function (Blueprint $table) { $table->increments('id'); $table->string('company_name'); $table->integer('loan_amount'); $table->float('interest_rate'); $table->integer('maximum_time_period'); $table->float('monthly_rental'); $table->timestamps(); }); ,然后将conditional aggregation用作

unpivot

Rextester Demo

答案 1 :(得分:1)

使用单个条件进行两个查询并将它们合并。这不是一个完美的解决方案,但是会起作用。

SELECT prod, '0-200' rang, AVG( price )
FROM   table_name
WHERE  amt BETWEEN 0 AND 200
GROUP BY prod
UNION ALL
SELECT prod, '150-300' rang, AVG( price )
FROM   table_name
WHERE  amt BETWEEN 150 AND 300
GROUP BY prod