2017-12-01 5 views
0

와 GROUP_BY을 수정 I했습니다 후속 테이블 : 프로젝트액티브는 일부 집계

enter image description here

내가 이전 삼년에 2017 년부터 프로젝트를 찾을했습니다. 그런 다음 status, elim, industry을 기준으로 필터링 된 프로젝트별로 그룹화합니다. 또한 각 연도를 기준으로 총 금액을 확인하려면 일부 집계가 필요합니다.

나는 다음을 수행하고 막혔다.

results = {} 
parameters = ['status', 'industry', 'elim'] 
@projects = Project.where("created_at >= ? AND created_at <= ?", 3.year.ago, DateTime.new(2017).end_of_year) 
parameters.each do |param| 
    results[param] = @projects.group_by{|p| [p.created_at.year]} 
end 

는 기본적으로, 결과처럼 원하는 :

results["status"] => [ 
         "2017": ["Active": 1, "Successful": 1], 
         "2016": ["Inactive": 1], 
         "2015": ["Active": 1] 
        ] 

results["elim"] => [ 
         "2017": ["Death": 2], 
         "2016": ["Flood": 1], 
         "2015": ["Flood": 1] 
        ] 
results["amount"] => [ 
         "2017": 32000.0, 
         "2016": 19000.0, 
         "2015": 2000.0, 
        ] 

내가 어떻게 달성 할 수 있습니까? 어떤 단서?

+0

'[ "2017": [ "죽음": 2], "2016": [ "홍수": 1], "2015": [ "홍수": 1]]' – Salil

+0

왜 그럴까요? 위의 테이블 이미지를주의 깊게 살펴보면 괜찮은 것입니다. – Emu

+0

레일 위의 어레이/루비 콘솔을 붙이면 알게 될 것입니다. – Salil

답변

0

을 다음과 같이해야합니다, 나는 그것을 조금 수정하고, 예상되는 대답을 얻었다.

parameters.each do |param| 
    results[param] = @projects.group_by{|p| p.created_at.year} 
    results[param].each do |key, values| 
    results[param][key] = values.group_by{|p| p.status} # changed here 
    end 
end 

감사합니다. (+1). 그러나 그것은 내가 생각하기에 꽤 비쌉니다. 더 좋은 생각이야?

1

보십시오 다음

parameters.each do |param| 
    results[param] = @projects.group_by{|p| p.created_at.year} 
    results[param].each do |key, values| 
    results[param][key] = values.each_with_object(Hash.new(0)) { |v, counts| counts[v.send(param)] += 1 } 
    end 
end 

결과를 살릴의 코드 @를의 도움으로

results["status"] => { 
         "2017": {"Active": 1, "Successful": 1}, 
         "2016": {"Inactive": 1}, 
         "2015": {"Active": 1} 
        } 
+0

실제로 매개 변수는'status'가 아니며 그룹화해야하는 열 이름입니다 – Emu

+0

그래서 결과적으로 "elim"]'이 필요하면 다시 루프를 실행해야합니까? – Emu

+0

지금보고있는 결과를 게시 할 수 있습니까? – Salil