Groovy-SQL-like中的多个参数分组

Groovy-SQL-like中的多个参数分组,groovy,group-by,Groovy,Group By,我有以下JSON: [ { "Country": "Norway", "Dept": "2", "Hours": "08,00" }, { "Country": "Norway", "Dept": "2", "Hours": "08,00" }, { "Country": "Sweden", "Dept": "1", "Hours": "08,00" },

我有以下JSON:

     [
   {
     "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
country和dept(如果我添加更多参数),并通过以下方式获得总工作时间:

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

如何在groovy中多次添加
GroupBY
,以实现这一点?我知道我需要添加一些
collectEntries
,但我不确定如何添加我想这就是您想要的,但我不喜欢我在地图上迭代并使用

v、 各{

列表我想这就是您想要的,但我不喜欢在地图上迭代并使用

v、 各{

请列出您的SQL查询。我唯一的意见是不要使用小时作为数学字符串。我同意您的看法,@fsi about string for math。但是,它是一个后端系统,以该格式返回JSON,我们不应该更改属性的格式。您能给我们显示您的SQL查询吗?我唯一的意见是不要使用小时作为m的字符串ath.我同意你的看法,@fsi about string for math.但是,它是一个后端系统,以该格式返回JSON,我们不应该更改属性的格式。+1脚本的其余部分(在map语句之后)可以缩减为
println new groovy.JSON.JsonBuilder(map.collect{k,v->v}.flatte()).toPrettyString()
或一些更精简的脚本-哦,那很好,我在文档上读过,不知道这个方法。与我的同事一起,我们也得到了这个:
def result=new JsonSlurper().parseText(hours)def grouped=[:]result.each{def key=“${it.HoursType}{it.Date}.toString()grouped[key]=grouped.get(key,new BigDecimal(0))+new BigDecimal(it.Hours.toString().replace(“,”,“))}分组。每个{key,value->println“$key:$value”}
非常类似于已经放置的解决方案。如果您只工作小时,这是可以的,但使用分钟?这很糟糕…(如果您这样做:01,40+01,20将是:02,60而不是03,00…)因此,在安全的情况下,使用datetime…+1脚本的其余部分(在map语句之后)可以简化为
println new groovy.json.JsonBuilder(map.collect{k,v->v}.flant()).toPrettyString()
或一些更精简的脚本-哦,那很好,我在文档上读过,不知道这个方法。与我的同事一起,我们也得到了这个:
def result=new JsonSlurper().parseText(hours)def grouped=[:]result.each{def key=“${it.HoursType}{it.Date}.toString()grouped[key]=grouped.get(key,new BigDecimal(0))+new BigDecimal(it.Hours.toString().replace(“,”,“))}分组。每个{key,value->println“$key:$value”}
非常类似于已经放置的解决方案。如果您只工作小时,这是可以的,但使用分钟?这很糟糕…(如果您这样做:01,40+01,20将是:02,60而不是03,00…)所以在安全的情况下,使用datetime。。。
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()