2014-05-13 159 views
0

我有查询的PostgreSQL和我想用钢轨集团按月份和年份的Rails

ActiveRecord::Base.connection.select_rows("SELECT to_char(date,'Mon') as mon, extract(year from date) as yyyy, SUM(CASE WHEN Title = 4 THEN Qty ELSE 0 END) AS sold FROM Transactions WHERE Store_id = 5 AND Product_id = 2 GROUP BY 1,2") 

我试过轨控制台上我的应用程序来实现,并且结果是:

←[1m←[36m (2.0ms)←[0m ←[1m 
SELECT to_char(date,'Mon') as mon, extract(year from date) as yyyy, SUM(CASE WHEN Title = 4 THEN Qty ELSE 0 END) AS sold FROM Transactions WHERE Store_id = 5 AND Product_id = 2 GROUP BY 1,2 
←[0m=> [["Jul", "2013", "113"], ["Oct", "2013", "73"], ["Jun", "2013", "291"], ["Sep", "2013", "13"], [" Aug", "2013", "81"]] 

的结果不按月份排序。

我尝试添加ORDER BY 1,2但结果是这样的:

←[1m←[36m (10.0ms)←[0m ←[1m 
SELECT to_char(date,'Mon') as mon, extract(year from date) as yyyy, SUM(CASE WHEN Title = 4 THEN Qty ELSE 0 END) AS sold FROM Transactions WHERE Store_id = 5 AND Product_id = 2 GROUP BY 1,2 ORDER BY 1,2 
←[0m=> [["Aug", "2013", "81"], ["Jul", "2013", "113"], ["Jun", "2013", "291"], ["Oct", "2013", "73"], ["Sep", "2013", "13"]] 

为什么结果不是按月份和年份排序?

我觉得这个ORDER BY “字母” 不是日期..

回答

1

我认为 “字母” 不是日期我目前的订单查询..

to_char(date,'Mon')

这是查询组由一个月和一年,然后为了通过月份和年份

ActiveRecord::Base.connection.select_rows("SELECT date_part('month', date), date_part('year', date), SUM(CASE WHEN Title = 4 THEN Qty ELSE 0 END) AS sold FROM Transactions WHERE Store_id = 5 AND Product_id = 2 GROUP BY date_part('month', date), date_part('year', date) ORDER BY date_part('month', date), date_part('year', date)") 

而结果是这样的:

←[1m←[36m (3.0ms)←[0m ←[1m 
SELECT date_part('month', date), date_part('year', date), SUM(CASE WHEN Title = 4 THEN Qty ELSE 0 END) AS sold FROM Transactions WHERE Store_id = 5 AND Product_id = 2 GROUP BY date_part('month', date), date_part('year', date) ORDER BY date_part(' 
month', date), date_part('year', date) 
←[0m=> [["6", "2013", "291"], ["7", "2013", "113"], ["8", "2013", "81"], ["9", "2013", "13"], ["10", "2013", "73"]] 
4

我on Rails的5.0.1这样做:

User. 
where('created_at >= ? AND created_at <= ?', start, finish). 
group('(EXTRACT(YEAR FROM created_at))::integer'). 
group('(EXTRACT(MONTH FROM created_at))::integer'). 
order('2 DESC, 3 DESC').count 

将会产生这样的:

{ 
    [2017, 2]=>1908, 
    [2017, 1]=>5910, 
    [2016, 12]=>6299, 
    [2016, 11]=>5717, 
    [2016, 10]=>5912, 
    [2016, 9]=>6098, 
    [2016, 8]=>5897, 
    [2016, 7]=>5896, 
    [2016, 6]=>5902, 
    [2016, 5]=>6279, 
    [2016, 4]=>5510, 
    [2016, 3]=>5323, 
    [2016, 2]=>5139, 
    [2016, 1]=>4293 
}