2017-04-04 1 views
0

Ich bin Daten holen von einer proprietären Datenbank (Sybase Advantage-ADS) Durch eine selbst geschriebene API, die PHP und geben die Ergebnisse als JSON verwendetRuby-SQL Ergebnis zu gruppierten Hash

so habe ich ein Ergebnis, das wie folgt aussieht

[ 
    {"year"=>"2016", "month"=>"1", "total"=>"1223"}, 
    {"year"=>"2016", "month"=>"2", "total"=>"613"}, 
    {"year"=>"2016", "month"=>"3", "total"=>"12351"}, 
    {"year"=>"2017", "month"=>"1", "total"=>"123123"}, 
    {"year"=>"2017", "month"=>"2", "total"=>"613123"}, 
    {"year"=>"2017", "month"=>"3", "total"=>"123"} 
] 

das ist, was ich in Ruby, jetzt in Auftrag abrufen mit dem Datum zu arbeiten ich so einen Hash erstellen möchte:

[ 
    {:name => "2017", :data => {"1" => 123123, "2" => 613123, "3" => 123}}, 
    {:name => "2016", :data => {"1" => 1223, "2" => 613, "3" => 12351}} 
] 

diese Ein großes Array wird geteilt und mit dem Jahreschlüssel zusammengeführt, wobei jede Kombination aus Monat und Summe darin enthalten ist.

Außerdem möchte ich den Wert des Monats als Schlüssel für die Summe verwenden.

Jede kleine Hilfe, um mich zu beginnen würde sehr geschätzt werden.

Antwort

0

wollen Sie Rubys mit beginnen #group_by Methode, die gruppieren die Zeilen für Jahr mit den Jahren als Schlüssel und Arrays von Zeilen wie die Kriterien entsprechen:

>> groups = result.group_by { |row| row['year'] } 
=> {"2016"=> 
    [{"year"=>"2016", "month"=>"1", "total"=>"1223"}, 
    {"year"=>"2016", "month"=>"2", "total"=>"613"}, 
    {"year"=>"2016", "month"=>"3", "total"=>"12351"}], 
"2017"=> 
    [{"year"=>"2017", "month"=>"1", "total"=>"123123"}, 
    {"year"=>"2017", "month"=>"2", "total"=>"613123"}, 
    {"year"=>"2017", "month"=>"3", "total"=>"123"}]} 

Weiter Sie verwenden werden #map Ihre Daten zu transformieren:

>> grouped_rows = groups.map { |year, values| {name: year, data: values.map { |value| [value['month'], value['total']] }.to_h} } 
=> [{:name=>"2016", :data=>{"1"=>"1223", "2"=>"613", "3"=>"12351"}}, 
{:name=>"2017", :data=>{"1"=>"123123", "2"=>"613123", "3"=>"123"}}] 

Wenn Sie die Zeilen wie gezeigt sortiert möchten, können Sie durch den Aufruf #sort_by auf das Ergebnis beenden:

>> grouped_rows.sort_by { |row| -row[:name].to_i } 
=> [{:name=>"2017", :data=>{"1"=>"123123", "2"=>"613123", "3"=>"123"}}, 
{:name=>"2016", :data=>{"1"=>"1223", "2"=>"613", "3"=>"12351"}}] 
Verwandte Themen