скрипт для заполнения ежемесячных сводных таблиц на основе поля даты в одной таблице - PullRequest
1 голос
/ 19 января 2012

Мне нужно разработать сценарий sql, такой как блок pl / sql, для заполнения записей в ежемесячные таблицы транзакций, такие как txn_jan, txn_feb ... txn_dec из одной таблицы пользовательских транзакций. в этой таблице есть поле currentdate, которое я могу проанализировать, чтобы получить месяц, а затем суммировать все подобные транзакции, увеличивая количество полей транзакции в каждой ежемесячной таблице (если все остальные поля одинаковы - resourceid, userid, objectid). Таким образом, если пользователь неоднократно выполнял одни и те же транзакции в течение дня, то таблица пользовательских транзакций будет иметь отдельные записи для каждой транзакции, а в ежемесячных сводных таблицах будет содержаться счет транзакции с только частью даты в ее поле даты (суммировать по времени в дата).

Как мне разработать скрипт для заполнения сводных таблиц ... У меня есть таблица транзакций пользователя, заполненная данными.

поля таблицы пользовательских транзакций : идентификатор пользователя, идентификатор ресурса, имя_документа, транзид, текущая дата (включает время)

поля таблицы сводных данных за месяц : идентификатор пользователя, идентификатор ресурса, имя_документа, транзид, currentdate (исключая время), trans_count

Я тоже могу сделать это, используя java или groovy ... но я подумал, что plsql может быть лучше?

Ответы [ 2 ]

1 голос
/ 19 января 2012

Вы хотите сделать две вещи здесь.Я предполагаю, что вы используете 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'

и продолжить ..

0 голосов
/ 19 января 2012

Что-то вроде этого может быть тем, что вы ищете:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...