首页 文章

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

提问于
浏览
1

我需要开发一个类似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

    你想在这里做两件事 . 我假设您正在使用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

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

    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)
    

相关问题