脚本根据一个表中的日期字段填充每月汇总表

时间:2012-01-19 02:26:38

标签: sql groovy plsql

我需要像pl / sql块一样开发一个sql脚本,将记录填充到每月事务表中,例如来自单个usertransaction表的txn_jan,txn_feb ... txn_dec。这个表有一个currentdate字段,我可以解析得到月份,然后通过在每个月表中输入transaction_cnt字段的数量来总结所有类似的事务(如果其他字段都相同 - resourceid,userid,objectid)。因此,如果用户在一天内重复执行相同的交易,那么usertransaction表将为每个trnasaction分配条目,但是每月汇总表将具有事务的计数,其日期部分仅包含日期部分(在时间上按时汇总)日期)。

如何开发用于填充汇总表的脚本..我的usertransaction表填充了数据。

  

usertransaction表字段:userid,resourceid,doc_name,transid,   currentdate(包括时间)

     

每月汇总表字段:userid,resourceid,doc_name,transid,   currentdate(不包括时间),trans_count

我也可以使用java或groovy这样做..但我认为plsql可能是最好的?

2 个答案:

答案 0 :(得分:1)

你想在这做两件事。我假设您正在使用Oracle(看到您正在使用Java)。

首先,您想要对每个用户的每日交易进行分组 创建一个名为tempTable的临时表 使用to_char(currentdate, 'yyyy/mm/dd')对其进行分组。

INSERT INTO tempTable
SELECT 
  userid,
  resourceid,
  doc_name,
  trans_id,
  to_char(currentdate, 'yyyy/mm/dd') as currentday,
  to_char(currentdate, 'MM') as month_value,
  count(*) as daily_count
FROM 
  usertransaction 
GROUP BY 
  userid,
  resourceid,
  doc_name,
  trans_id,
  to_char(currentdate, 'yyyy/mm/dd')

如果你有太多的数据行,我建议你这样做;每天做一次。

INSERT INTO tempTable
SELECT 
  userid,
  resourceid,
  doc_name,
  to_char(currentdate, 'yyyy/mm/dd') as currentday,
  to_char(currentdate, 'MM') as month_value,
  count(*) as daily_count
FROM 
  usertransaction 
WHERE
  to_char(currentdate, 'yyyy/mm/dd') = to_char(SYSDATE, 'yyyy/mm/dd')
GROUP BY 
  userid,
  resourceid,
  doc_name,
  trans_id

其次,您需要根据month_value进行多次插入。

INSERT INTO txn_jan
SELECT
  userid,
  resourceid,
  doc_name,
  to_date(current_day, 'yyyy/mm/dd') as current_day,
  daily_count
FROM
  tempTable
WHERE month_value='01'

INSERT INTO txn_feb
SELECT
  userid,
  resourceid,
  doc_name,
  to_date(current_day, 'yyyy/mm/dd') as current_day,
  daily_count
FROM
  tempTable
WHERE month_value='02'

继续......

答案 1 :(得分:0)

这样的事情可能就是你所追求的:

INSERT INTO txn_jan
SELECT userid, resourceid, doc_name, transid,
    cast(currentdate as date) as currentdate,
    count(*) as trans_count
FROM usertransaction
WHERE extract(year from currentdate) = 2012
    and extract(month from currentdate) = 1
GROUP BY cast(currentdate as date)