You Asked
I want to dynamically create the next month. I do not want to copy and paste the last line and change the month to the next month manually. For example, the next line would be SUM((DECODE(YEAR_MONTH,'200206',SUM_SAMPLES,NULL))) SAMPLES_MADE_200206. I am not asking for you to do it. What I am asking is where I can find a good example to learn from. I was reading the questions on www.orafaq.org and I must admit I am getting confused. I am assuming that I would want to use a cursor. If my question does not belong here, I apologize. Any assistance would be greatly appreciated. I do not have much experience in cursors.
INSERT INTO LJC_TABLE
SELECT ACM_MSTRACCOUNTKEY,
ACM_MEDPROVNO,
ACM_EXTPHYSRXID,
SMPL_ID,
SMPL_DESC_TEXT,
SUM((DECODE(YEAR_MONTH,'200001',SUM_SAMPLES,NULL))) SAMPLES_MADE_200001,
SUM((DECODE(YEAR_MONTH,'200002',SUM_SAMPLES,NULL))) SAMPLES_MADE_200002,
SUM((DECODE(YEAR_MONTH,'200003',SUM_SAMPLES,NULL))) SAMPLES_MADE_200003,
SUM((DECODE(YEAR_MONTH,'200004',SUM_SAMPLES,NULL))) SAMPLES_MADE_200004,
SUM((DECODE(YEAR_MONTH,'200005',SUM_SAMPLES,NULL))) SAMPLES_MADE_200005,
SUM((DECODE(YEAR_MONTH,'200006',SUM_SAMPLES,NULL))) SAMPLES_MADE_200006,
SUM((DECODE(YEAR_MONTH,'200007',SUM_SAMPLES,NULL))) SAMPLES_MADE_200007,
SUM((DECODE(YEAR_MONTH,'200008',SUM_SAMPLES,NULL))) SAMPLES_MADE_200008,
SUM((DECODE(YEAR_MONTH,'200009',SUM_SAMPLES,NULL))) SAMPLES_MADE_200009,
SUM((DECODE(YEAR_MONTH,'200010',SUM_SAMPLES,NULL))) SAMPLES_MADE_200010,
SUM((DECODE(YEAR_MONTH,'200011',SUM_SAMPLES,NULL))) SAMPLES_MADE_200011,
SUM((DECODE(YEAR_MONTH,'200012',SUM_SAMPLES,NULL))) SAMPLES_MADE_200012,
SUM((DECODE(YEAR_MONTH,'200101',SUM_SAMPLES,NULL))) SAMPLES_MADE_200101,
SUM((DECODE(YEAR_MONTH,'200102',SUM_SAMPLES,NULL))) SAMPLES_MADE_200102,
SUM((DECODE(YEAR_MONTH,'200103',SUM_SAMPLES,NULL))) SAMPLES_MADE_200103,
SUM((DECODE(YEAR_MONTH,'200104',SUM_SAMPLES,NULL))) SAMPLES_MADE_200104,
SUM((DECODE(YEAR_MONTH,'200105',SUM_SAMPLES,NULL))) SAMPLES_MADE_200105,
SUM((DECODE(YEAR_MONTH,'200106',SUM_SAMPLES,NULL))) SAMPLES_MADE_200106,
SUM((DECODE(YEAR_MONTH,'200107',SUM_SAMPLES,NULL))) SAMPLES_MADE_200107,
SUM((DECODE(YEAR_MONTH,'200108',SUM_SAMPLES,NULL))) SAMPLES_MADE_200108,
SUM((DECODE(YEAR_MONTH,'200109',SUM_SAMPLES,NULL))) SAMPLES_MADE_200109,
SUM((DECODE(YEAR_MONTH,'200110',SUM_SAMPLES,NULL))) SAMPLES_MADE_200110,
SUM((DECODE(YEAR_MONTH,'200111',SUM_SAMPLES,NULL))) SAMPLES_MADE_200111,
SUM((DECODE(YEAR_MONTH,'200112',SUM_SAMPLES,NULL))) SAMPLES_MADE_200112,
SUM((DECODE(YEAR_MONTH,'200201',SUM_SAMPLES,NULL))) SAMPLES_MADE_200201,
SUM((DECODE(YEAR_MONTH,'200202',SUM_SAMPLES,NULL))) SAMPLES_MADE_200202,
SUM((DECODE(YEAR_MONTH,'200203',SUM_SAMPLES,NULL))) SAMPLES_MADE_200203,
SUM((DECODE(YEAR_MONTH,'200204',SUM_SAMPLES,NULL))) SAMPLES_MADE_200204,
SUM((DECODE(YEAR_MONTH,'200205',SUM_SAMPLES,NULL))) SAMPLES_MADE_200205
FROM LJC_SAMPLES_PREPIVOT
WHERE SMPL_ID=1900000520
GROUP BY ACM_MSTRACCOUNTKEY, ACM_MEDPROVNO, ACM_EXTPHYSRXID, SMPL_ID, SMPL_DESC_TEXT
ORDER BY ACM_MSTRACCOUNTKEY, ACM_MEDPROVNO, ACM_EXTPHYSRXID, SMPL_ID, SMPL_DESC_TEXT
and Tom said...
You need to dynamically generate this insert then -- it could look like this:
create or replace procedure do_insert( p_start_month in date )
as
l_stmt long;
l_month_to date default add_months( trunc(sysdate,'month'), -1 );
l_curr_month date default p_start_month;
begin
l_stmt := 'insert into ljc_taable
select CM_MSTRACCOUNTKEY, ACM_MEDPROVNO,
ACM_EXTPHYSRXID, SMPL_ID, SMPL_DESC_TEXT,';
for i in 0 .. months_between( l_month_to, p_start_month )
loop
l_stmt := l_stmt ||
'sum((decode(year_month,''' ||
to_char(l_curr_month, 'yyyymm' ) ||
''', sum_samples,0))) samples_made_' ||
to_char(l_curr_month,'yyyymm') || ',';
l_curr_month := add_months(l_curr_month,1);
end loop;
l_stmt := rtrim(l_stmt,',') || ' FROM LJC_SAMPLES_PREPIVOT
WHERE SMPL_ID=1900000520
GROUP BY ACM_MSTRACCOUNTKEY, ACM_MEDPROVNO, ACM_EXTPHYSRXID, SMPL_ID,
SMPL_DESC_TEXT
ORDER BY ACM_MSTRACCOUNTKEY, ACM_MEDPROVNO, ACM_EXTPHYSRXID, SMPL_ID,
SMPL_DESC_TEXT';
execute immediate l_stmt;
end;
/
exec do_insert( to_date( '200001','yyyymm' ) );
given that it is july right now -- that'll create an insert upto 200206
Rating
(9 ratings)
Is this answer out of date? If it is, please let us know via a Comment