GROOVYデータ列変行


開発中に列の変行の問題に遭遇し、簡単に以下のように記録した.
tb_ケースには、使用例ID使用例名が記録されている.tb_retは、実行結果、実行時間結果状態を記録する.
次のデータ・レポートを取得するには、一定期間のレコードをクエリーする必要があります.
1時2時3時4時5時・・・24時
用例1 1 2 1 4 4
用例5 1 3 1 4 4
用例4 1 2 1 4 4
groovyコードを使用すると、50行を超えないように簡単に実現できます.例は以下のとおりです.
import groovy.sql.Sql
def sql = Sql.newInstance('JDBCURL', '   ', '  ',  '  ')
def String s_in = '1, 2, 3, 51, 9999'
def String st_case = """SELECT c_id, c_name FROM tb_case WHERE c_id IN ($s_in)"""
def String st_query = """
SELECT c_id, to_char(r_start, 'yyyymmddhh24') rtime, SUM(r_stat) stat
  FROM tb_ret
 WHERE c_id IN ($s_in)
   AND r_start BETWEEN to_date('20100710', 'yyyymmdd') AND to_date('20100720', 'yyyymmdd')
 GROUP BY c_id, to_char(r_start, 'yyyymmddhh24')
 """
def cases = [:]
sql.eachRow(st_case){ ret ->
    cases[(Integer) ret[0]]=ret[1]
}
def rets = [:]
def times = [:]
sql.eachRow(st_query){
    def (c_id, rtime, stat) = [(Integer) it[0], it[1], it[2] ]
    if (!times.containsKey(rtime)){ times[rtime] = -1 }
    if (!rets.containsKey(c_id)){ rets[c_id] = [:] }
    rets[c_id][rtime] = stat
}
print "  ".padRight(16)
times.sort().each{ k, v-> print "$k\t" }
println ""
//       
cases.each{ k, v ->
    if (!rets.containsKey(k)) rets[k]=[:]
}
rets.sort().each{ k, v ->
    //        
    def fulltime = times.plus(v)
    print k
    print cases[k].padRight(16)
    fulltime.sort().each{ k1, v1 ->
        print "\t$v1"
    }
    println "" 
}