グループ

こんなデータがあるとして、

[
    { name: "筒香",   bats: 5, hits: 3 },
    { name: "ロペス", bats: 5, hits: 2 },
    { name: "宮崎",   bats: 5, hits: 4 },
    { name: "筒香",   bats: 4, hits: 2 },
    { name: "ロペス", bats: 4, hits: 4 },
    { name: "宮崎",   bats: 4, hits: 4 },
]

こんな結果が欲しいとき

[
    {:name=>"宮崎", :bats=>9, :hits=>8},
    {:name=>"ロペス", :bats=>9, :hits=>6}, 
    {:name=>"筒香", :bats=>9, :hits=>5}, 
]

rubyでこんな風に書いた

records = [
    { name: "筒香",   bats: 5, hits: 3 },
    { name: "ロペス", bats: 5, hits: 2 },
    { name: "宮崎",   bats: 5, hits: 4 },
    { name: "筒香",   bats: 4, hits: 2 },
    { name: "ロペス", bats: 4, hits: 4 },
    { name: "宮崎",   bats: 4, hits: 4 },
]

ans =  records.each_with_object([]) do |item, memo|
    if ev = memo.detect{ |ev| item[:name] == ev[:name] }
        ev.merge!(item.merge(bats: item[:bats] + ev[:bats], hits: item[:hits] + ev[:hits]))
    else
        memo << item.dup
    end
end
.sort_by{|h| -h[:hits] }

p ans
# [
#     {:name=>"宮崎", :bats=>9, :hits=>8},
#     {:name=>"ロペス", :bats=>9, :hits=>6},
#     {:name=>"筒香", :bats=>9, :hits=>5}
# ]

SQLのほうがシンプルに書ける。

# create table
create table bayrecord (
    name varchar(20),
    bats int,
    hits int
);

# insert data
insert into bayrecord values ('筒香', 5, 3);
insert into bayrecord values ('ロペス', 5, 2);
insert into bayrecord values ('宮崎', 5, 4);
insert into bayrecord values ('筒香', 4, 2);
insert into bayrecord values ('ロペス', 4, 4);
insert into bayrecord values ('宮崎', 4, 4);

# select
select name, sum(bats), sum(hits) 
    from bayrecord
    group by name
    order by sum(hits) desc;

参考 ja.stackoverflow.com