根据列的整数间隔获取行

时间:2016-10-27 19:25:15

标签: ruby-on-rails postgresql

我正在使用rails 5.0.0和postgresql

我有3个表,即orderscart_itemsproducts。它们之间的关系如下:     订单has_many cart_items     cart_item belongs_to product

产品表包含产品的价格。

我想要做的是获取价格范围2500之间的订单数量,包含价值在0-2500之间,2500-5000之间的产品等等。

提前致谢。

2 个答案:

答案 0 :(得分:2)

这里的概念是按照total_price除以2500(我们在这里谈论整数除法)对每个订单进行分组,这样您就可以按照“切片类别”进行分组。

由于:

300/2500 = 0
400/2500 = 0
2500/2500 = 1
3000/2500 = 1
3000/2500 = 1
4999/2500 = 1
5000/2500 = 2

等。这是整数除法的结果,它将创建我之前称之为“切片类别”(1 => 0-2500,2 => 2500-5000,3 => 5000-7500等)。由于您的总价可能是十进制或浮点数,因此我“舍入”该值并将其转换为::integer

查询可以是这样的:

SELECT count(*), (sliced_2500_category + 1) * 2500 AS sliced_2500_group FROM ( SELECT c.order_id, ROUND(SUM(price))::integer / 2500 AS sliced_2500_category FROM cart_items c INNER JOIN products p ON c.product_id = p.id GROUP BY c.order_id ) orders_by_2500_category GROUP BY sliced_2500_category;

答案 1 :(得分:0)

确保您的cart_itemsbelongs_to :ordersproduct模型has_many cart_items
我猜您要选择0-2500范围内的发票/购物车等等。
原始SQL:

SELECT order_id, sum(price)
FROM cart_items c INNER JOIN products p
ON c.product_id = p.id
GROUP_BY order_id
HAVING sum(price) BETWEEN 0 AND 2500

控制器的必需声明:

CartItem.joins(:product)
        .select(:order_id, 'sum(price)')
        .group(:order_id)
        .having('sum(price) BETWEEN 0 AND ?', params[:your_upper_limit_variable])