2017-05-17 7 views
0

私は、次のJSONを持っている:グループSQLに似た

 [ 
    { 
    "Country": "Norway", 
    "Dept": "2", 
    "Hours": "08,00" 
    }, 
    { 
    "Country": "Norway", 
    "Dept": "2", 
    "Hours": "08,00" 
    }, 
    { 
    "Country": "Sweden", 
    "Dept": "1", 
    "Hours": "08,00" 
    }, 
    { 
    "Country": "Sweden", 
    "Dept": "2", 
    "Hours": "08,00" 
    } 
] 

は私がgroupBy国とDEPT(と私はより多くのパラメータを追加した場合)を記述し、労働時間の合計数を取得したいです次のように:

 [ 
    { 
    "Country": "Norway", 
    "Dept": "2", 
    "Hours": "16,00" 
    }, 
    { 
    "Country": "Sweden", 
    "Dept": "1", 
    "Hours": "08,00" 
    }, 
    { 
    "Country": "Sweden", 
    "Dept": "2", 
    "Hours": "08,00" 
    } 
] 

それはどのように私はそれを達成するようにグルーヴィーにGroupBYを複数回追加することが可能でしょうか?私はいくつかのcollectEntriesを追加する必要があることがわかりますが、私は、これはあなたが探して何だと思うか

+0

あなたは私達にあなたのSQLクエリを表示することができますか? – dsharew

+0

私の唯一の意見は、数学のための文字列として時間を使用しないことです。 – fsi

+0

数学のための文字列について@fsiに同意します。ただし、JSONをその形式で返すバックエンドシステムであり、プロパティの形式を変更することは想定されていません。 –

答えて

2

私はわからないが、私は地図上の反復処理し、新しいリストに<<を使用していたどのように私は好きではなかったです。

Ps;あなたの変数Hoursは文字列です、私は数値として鉱山でした。

def map = objJson.groupBy({it.Country}, {it.Dept}).collectEntries { k, v -> 
    [k, v.collect{ [Hours: it.value.Hours.sum(), Dept: it.value.Dept[0], Country: it.value.Country[0]] }] 
} 

def list = [] 
map.each(){ k, v -> 
    v.each{ 
     list << it 
    } 
} 
return new JsonBuilder(list).toPrettyString() 
+1

+1スクリプトの残りの部分(マップ文の後)を 'println new groovy.json.JsonBuilder(map.collect {k、v - > v} .flatten())に減らすことができます。toPrettyString()' – Rao

+0

より凝縮されたスクリプト - http://groovyconsole.appspot.com/script/5157102054014976 – Rao

+0

ああ、いいです、私はドキュメントでそれを読んで、この方法について知りませんでした。私の同僚と – fsi

関連する問題