pinkuray
asked on
Need help in writing a procedure in Oracle
I have a excel file data attached here :
Columns are as below:
Team Rep Total Calls Total Duration Date
Where I want to output by giving an from data and to sysdate(today's date)
So the report should give me Like as below:
Team ,Rep,Total Calls ,Total Duration ,WeeklyAverageCalls,Weekly AverageDur ation,Mont hlyAvgCall s,MonthlyA vgDuration ,YearlyAvg Call and lastly YearlyAvgDuration .
Should have in a single row.
Is there any way where I can pass the dates as a parameter so that It will calculate accordingly.
Test-data.xls
Columns are as below:
Team Rep Total Calls Total Duration Date
Where I want to output by giving an from data and to sysdate(today's date)
So the report should give me Like as below:
Team ,Rep,Total Calls ,Total Duration ,WeeklyAverageCalls,Weekly
Should have in a single row.
Is there any way where I can pass the dates as a parameter so that It will calculate accordingly.
Test-data.xls
is this data present in some oracle table ?
what is the output data you wanted ?
Can you confirm the data you had given in the excel is the input data ?
Can you confirm the data you had given in the excel is the input data ?
ASKER
The data is not loaded into oracle database...
I also want to load it 1st then generate the report.
I am failing in loading the data for column total_duration and date.
Can you suggest me what should be the proper structure for loading sucessfully the file into oracle db
and also if I need to change the format of the file.
I also want to load it 1st then generate the report.
I am failing in loading the data for column total_duration and date.
Can you suggest me what should be the proper structure for loading sucessfully the file into oracle db
and also if I need to change the format of the file.
how are you loading the data into the table ? sqlloader or some procedure or any other means ?
Is this question to deal with the data loading issues ? or to deal with the query after the data gets loaded into the table ?
Thanks
Is this question to deal with the data loading issues ? or to deal with the query after the data gets loaded into the table ?
Thanks
ASKER
For both I have issue :
1st loading the data into database and then writing a procedure with date param to get report as posted before.
I was loading the data into DB through SQL Developer but I see an Issue with that :
column “Total Duration” comes with default date i.e. 1/10/1900 12:00:00 AM if the data in excel sheet is “0:00:00”
The correct data is “0:00:00”
But when you click in excel sheet it converts it and make it into another format where all my loading goes wrong.
Where I want the data like “0:00:00” but if try to format it and load it shows the same value with "12:00:00"
Can you please suggest on this
1st loading the data into database and then writing a procedure with date param to get report as posted before.
I was loading the data into DB through SQL Developer but I see an Issue with that :
column “Total Duration” comes with default date i.e. 1/10/1900 12:00:00 AM if the data in excel sheet is “0:00:00”
The correct data is “0:00:00”
But when you click in excel sheet it converts it and make it into another format where all my loading goes wrong.
Where I want the data like “0:00:00” but if try to format it and load it shows the same value with "12:00:00"
Can you please suggest on this
" I was loading the data into DB through SQL Developer but I see an Issue with that :
column “Total Duration” comes with default date i.e. 1/10/1900 12:00:00 AM if the data in excel sheet is “0:00:00”
The correct data is “0:00:00”
But when you click in excel sheet it converts it and make it into another format where all my loading goes wrong.
Where I want the data like “0:00:00” but if try to format it and load it shows the same value with "12:00:00"
Can you please suggest on this " ----> Nothing incorrect with this. This is working fine. It is just the way you are display it in sql developer. If you display in 24 hour format, then 12:00:00 AM will become like 00:00:00
Thanks
column “Total Duration” comes with default date i.e. 1/10/1900 12:00:00 AM if the data in excel sheet is “0:00:00”
The correct data is “0:00:00”
But when you click in excel sheet it converts it and make it into another format where all my loading goes wrong.
Where I want the data like “0:00:00” but if try to format it and load it shows the same value with "12:00:00"
Can you please suggest on this " ----> Nothing incorrect with this. This is working fine. It is just the way you are display it in sql developer. If you display in 24 hour format, then 12:00:00 AM will become like 00:00:00
Thanks
ASKER
How can I set to 12 hr for this table only or to specific column
what is the query you are using in sql developer to see the data ? give me that query and i can modify it.
ASKER
Here you go with the sql query :
select * from P_DETAIL;
Result:
Team Rep TotalCalls TotalDuration Call_Date
-------------------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- -----
Bteam Ramos, Neicy 0 12:00:00 06-OCT-10
LTeam O''Chuida 0 12:00:00 06-OCT-10
You can see two Issues in this :
One with TotalDuration and another one with Rep Name for 2nd record :
O''Chuida Origainal name in file is O'Chuida
Can you also suggest this.
select * from P_DETAIL;
Result:
Team Rep TotalCalls TotalDuration Call_Date
--------------------------
Bteam Ramos, Neicy 0 12:00:00 06-OCT-10
LTeam O''Chuida 0 12:00:00 06-OCT-10
You can see two Issues in this :
One with TotalDuration and another one with Rep Name for 2nd record :
O''Chuida Origainal name in file is O'Chuida
Can you also suggest this.
what is the data type of the TotalDuration ? I think it is set to date right.
But i believe you wanted to store only the time portion in hh24:mi:ss format in it right ?
try the below :
select team, rep, totalcalls, to_char(totalduration,'hh2 4:mi:ss') total_duration , call_date from P_DETAIL;
But i believe you wanted to store only the time portion in hh24:mi:ss format in it right ?
try the below :
select team, rep, totalcalls, to_char(totalduration,'hh2
try the revised query : ( this will take care of both the issues you wanted )
select team, replace(rep,'''''','''') rep, totalcalls, to_char(totalduration,'hh2 4:mi:ss') total_duration , call_date from P_DETAIL;
select team, replace(rep,'''''','''') rep, totalcalls, to_char(totalduration,'hh2
ASKER
I was directly loading the file into Oracle database and made it something like this :
Team varchar2(40),
Rep varchar2(40),
TOTAL_CALLS number,
TOTAL_DURATION VARCHAR2(21),
CALL_DATE date
Do I need to change this ?
Please let me know the correct datatype for loading this.
Team varchar2(40),
Rep varchar2(40),
TOTAL_CALLS number,
TOTAL_DURATION VARCHAR2(21),
CALL_DATE date
Do I need to change this ?
Please let me know the correct datatype for loading this.
i think the best thing is to store the total_duration in seconds in excel itself and then store it as a number data type in the table so that we can easily get the queries to give sum, avg,etc otherwise we end up in difficulty there.
for example, in excel if the total duration is 01:01:03, then you should a final value as 423
i,e 1 hour * 60 * 60 = 3600 +
1 min * 60 = 60 +
3 secs = 3
= 3663 ( so in excel this value you can put for total duration and load it into table with number data type )
Thanks
for example, in excel if the total duration is 01:01:03, then you should a final value as 423
i,e 1 hour * 60 * 60 = 3600 +
1 min * 60 = 60 +
3 secs = 3
= 3663 ( so in excel this value you can put for total duration and load it into table with number data type )
Thanks
ASKER
So If i click on Format the column in excel then which Category I should be Using it and in what sample .
Can you please bring some light to this ?
Can you please bring some light to this ?
1) How did you get the data into excel first ?
2)Do you need only date or only time portion or both date/time value for this TOTAL DURATION ?
a) as i see some records have date portion along with time in it but only time portion is shown because of cell formats ( excel cells D2 to D12 )
b) some records do not have date portion in it ( cells D13 to D56 ) and only time portion is there and that is displayed.
c) again some records have some date portion in it along with time and so on..
Can you first get the data in this "Total Duration" column to the same format which ever one you want with date & time or only time. Once this is sorted, we can see how to load this into oracle.
Thanks
2)Do you need only date or only time portion or both date/time value for this TOTAL DURATION ?
a) as i see some records have date portion along with time in it but only time portion is shown because of cell formats ( excel cells D2 to D12 )
b) some records do not have date portion in it ( cells D13 to D56 ) and only time portion is there and that is displayed.
c) again some records have some date portion in it along with time and so on..
Can you first get the data in this "Total Duration" column to the same format which ever one you want with date & time or only time. Once this is sorted, we can see how to load this into oracle.
Thanks
ASKER
1) Data is loaded to excel by other source where I dont have any control.
2) I want only the time to be loaded to my column
a) you are correct but this is how I get the data everytime and that cannot be fixed. So need some theory to do it by my own where I can get only the time by formatting it.
b) True but if you format the excel to time then you will can see what is the correct data.
c) Exartly for this reason I was gettting error out while loading the data into oracle
For all the question we just need to format the excel category to time and then you can get all the proper data.
2) I want only the time to be loaded to my column
a) you are correct but this is how I get the data everytime and that cannot be fixed. So need some theory to do it by my own where I can get only the time by formatting it.
b) True but if you format the excel to time then you will can see what is the correct data.
c) Exartly for this reason I was gettting error out while loading the data into oracle
For all the question we just need to format the excel category to time and then you can get all the proper data.
formatting the excel - just shows how the data is seen in the excel cells and everyone will think only time portion is there but if you look in the formula bar some cells do have date portion in it .
i think you can only do it manually as there are only 100+ records which have this issue. so just get the data into the proper format and then i upload here and i can verify it for you.
If everything is fine, then we can load to the table.
Thanks
i think you can only do it manually as there are only 100+ records which have this issue. so just get the data into the proper format and then i upload here and i can verify it for you.
If everything is fine, then we can load to the table.
Thanks
ASKER
But then everytime I need to do it manually as this will go as a daily report genaration
in that case first get this investigated and understand how you get some value with date & time and some only with time and so on... --> "Data is loaded to excel by other source where I dont have any control."
Unless this is fixed, you cannot properly load data into table and use it for reporting.
Thanks,
Unless this is fixed, you cannot properly load data into table and use it for reporting.
Thanks,
ASKER
@ Nav Kum V.
I have loaded the data into Oracle Db with all the required format with SQL Loader without chaning any thing on excel.
Now can you help me writing the procedure with date parameter for calculating the Month to date ,year to date and week to date like one single row as below:
Team ,Rep,Total Calls ,Total_Duration ,WeeklyAverageCalls,Weekly AverageDur ation,Mont hlyAvgCall s,MonthlyA vgDuration ,YearlyAvg Call and lastly YearlyAvgDuration .
The report should go something like from date and to date give given then the above row should calculate and give you the result.
I have loaded the data into Oracle Db with all the required format with SQL Loader without chaning any thing on excel.
Now can you help me writing the procedure with date parameter for calculating the Month to date ,year to date and week to date like one single row as below:
Team ,Rep,Total Calls ,Total_Duration ,WeeklyAverageCalls,Weekly
The report should go something like from date and to date give given then the above row should calculate and give you the result.
Can you please provide sample output data in the excel itself for the input data which you had given ?
Also can you please post the data types of all the columns in this table ? if total_duration is varchar2, it will become a complex task to calculate average etc...
Also can you please post the data types of all the columns in this table ? if total_duration is varchar2, it will become a complex task to calculate average etc...
ASKER
Structure of the Tbale is like below:
create table pstatus
(TEAM VARCHAR2(20) ,
REP VARCHAR2(25) ,
TOTAL_CALLS NUMBER,
TOTAL_DURATION VARCHAR2(19),
CALL_DATE DATE) ;
I dont have any sample output now ...I need to calculate manually and then I can provide ..
I will Upload the sample soon
create table pstatus
(TEAM VARCHAR2(20) ,
REP VARCHAR2(25) ,
TOTAL_CALLS NUMBER,
TOTAL_DURATION VARCHAR2(19),
CALL_DATE DATE) ;
I dont have any sample output now ...I need to calculate manually and then I can provide ..
I will Upload the sample soon
also provide me the fresh input data because some records are having date and some not for the TOTAL_DURATION in the excel which you had given.
You told me that you have loaded data into oracle table using sqlloader. So just query the table and give the fresh input data in an excel along with what outputs you need.
I can then come up with the query you need.
You told me that you have loaded data into oracle table using sqlloader. So just query the table and give the fresh input data in an excel along with what outputs you need.
I can then come up with the query you need.
ASKER
Please find the fress data from query :
Test-data.xls
Test-data.xls
did you check the fresh data in the excel in the column call_duration column.. again it has the same issues as i told before.
excel d12 cell has date value but d13 cell does not have date and only time portion is there.
The disadvantage is that this is a varchar column and if you hava data like this, it is not possible to get the query you wanted.
You run the below query to see how bad your data is...
select call_duration, length(call_duration) from pstatus;
for example, if you data is all fine then the length of call_duration should all have the same value.
Thanks,
excel d12 cell has date value but d13 cell does not have date and only time portion is there.
The disadvantage is that this is a varchar column and if you hava data like this, it is not possible to get the query you wanted.
You run the below query to see how bad your data is...
select call_duration, length(call_duration) from pstatus;
for example, if you data is all fine then the length of call_duration should all have the same value.
Thanks,
ASKER
I have run this query where the result shows me as below:
select distinct (length(total_duration)) from pstatus;
Result:
------------------
7
It is having the same value as 7 nothing else...
select distinct (length(total_duration)) from pstatus;
Result:
------------------
7
It is having the same value as 7 nothing else...
ok.. do you think it is possilble for you to add another column in the same table to have the time duration in seconds instead of varchar2 as that will help to do the calculations easily ?
I can give you the update for this table to populate the new column which you are going to add.
I can give you the update for this table to populate the new column which you are going to add.
ASKER
Sure thats fine I was wondering is it possible if we could convert the values at the time of inserting to the table into seconds then it would solve the automation process to, so I dont have to change the value from excel like let the excel sheet comes in the same manner , if we can convert it to seconds while inserting the data to table then everything goes fine.
Can you please try to make in this way ?
Can you please try to make in this way ?
doing that conversion stuff is not easier in sql*loader as you are using that to load the data right ?
may be we can setup a trigger before insert into this table to see whether we can convert the values for the duration_secs column and as usual you can use the sql loader to load this file.
Thanks
may be we can setup a trigger before insert into this table to see whether we can convert the values for the duration_secs column and as usual you can use the sql loader to load this file.
Thanks
ASKER
Thats sounds really great to have a trigger on a table to convert the column record to seconds but we need to change the table structure .
After which we can make our procedure easily.
Please provide me the code.
Thanks.
After which we can make our procedure easily.
Please provide me the code.
Thanks.
Do you know how to write triggers or no ?
I will not be able to write code for you due to time constraints. But i can help if you can come up with the basic code for the trigger.
First get the table altered to have a new column called something like duration_secs with number data type.
Thanks
I will not be able to write code for you due to time constraints. But i can help if you can come up with the basic code for the trigger.
First get the table altered to have a new column called something like duration_secs with number data type.
Thanks
ASKER
I have added the column to the existing table and here is the code attached for trigger ...
Just you need to help me in doing the conversion the total_duration column to seconds :
The trigger code is just a smaple where i need to add your conversion formula :
Just you need to help me in doing the conversion the total_duration column to seconds :
The trigger code is just a smaple where i need to add your conversion formula :
-- Table is been alterd now
Alter Table phone_status add ( total_duration_seconds number);
-- Trigger for converting the total_duration value to seconds
CREATE OR REPLACE TRIGGER convert_duration_sec
AFTER INSERT
ON phone_status
FOR EACH ROW
declare
v_total_duration varchar2(10);
begin
-- Need to add the conversion formula
SELECT convert total_duration INTO v_total_duration
FROM phone_status;
-- Insert record into phone_status table
INSERT INTO phone_status
( total_duration_seconds )
VALUES
( v_total_duration );
END;
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks nav kum v: as the Oracle database is undergoing on maintenance , once that is fixed I will update you soon....
Fine with me.
ASKER
Hi...
I have loaded the file into the system and it generated the records with second based on table trigger.
So now the main procedure has to be written with date param.
I have loaded the file into the system and it generated the records with second based on table trigger.
So now the main procedure has to be written with date param.
can you please send me the data in excel for all the columns, so i can load them into my table and then give the queries you wanted.
Thanks
Thanks
ASKER
Please find the attached file having the recent updated data table-export.csv
I appreciate if you can provide me sample output data in another excel atleast for first 1 or 2 sample input records which you have provided in the table-export.csv excel file. This would help to give me the query you wanted precisely.
I am bit not clear whether the output should have that many records in the input data or it should be aggregated ( i,e should it grouped etc ) ??
Thanks
I am bit not clear whether the output should have that many records in the input data or it should be aggregated ( i,e should it grouped etc ) ??
Thanks
also would be nice if you can explain what is the logic should i use for these columns ?
WeeklyAverageCalls, ---> do you mean sum(calls)/number of weeks in a year or do you mean sum(calls) / number of weeks until now in the year or some other logic ?
WeeklyAverageDuration ---> similarly as above.
Please explain similarly for the below on what logic should i use them to compute it.
MonthlyAvgCalls
MonthlyAvgDuration
YearlyAvg Call
YearlyAvgDuration
WeeklyAverageCalls, ---> do you mean sum(calls)/number of weeks in a year or do you mean sum(calls) / number of weeks until now in the year or some other logic ?
WeeklyAverageDuration ---> similarly as above.
Please explain similarly for the below on what logic should i use them to compute it.
MonthlyAvgCalls
MonthlyAvgDuration
YearlyAvg Call
YearlyAvgDuration
So now i am all ready with the data loaded into sample table in my test database. So if you just let me know the sample output and logic to be used, we can complete the query and close this question as this is going on like a project :)
ASKER
Hi...
Sorry for the delay:
I have the output of the required data as an example ...
So I am attaching the file with the data I have and the target sheet for how I want them to be..
Thanks Test.xlsx
Sorry for the delay:
I have the output of the required data as an example ...
So I am attaching the file with the data I have and the target sheet for how I want them to be..
Thanks Test.xlsx
try this. It uses to get the total calls for the current week, current month, current year. Test it and let me know for any changes.
with x as ( select to_char(sysdate,'mm') mm,
to_char(sysdate,'yyyy') yy ,
to_char(sysdate,'ww') ww
from dual )
select rep,
sum(case when to_char(call_date,'ww')= x.ww then total_calls else 0 end) weektodate,
sum(case when to_char(call_date,'mm')= x.mm then total_calls else 0 end) monthtodate,
sum(case when to_char(call_date,'yyyy')= x.yy then total_calls else 0 end) yeartodate
from pinkuray_tbl , x
group by rep
order by rep
with x as ( select to_char(sysdate,'mm') mm,
to_char(sysdate,'yyyy') yy ,
to_char(sysdate,'ww') ww
from dual )
select rep,
sum(case when to_char(call_date,'ww')= x.ww then total_calls else 0 end) weektodate,
sum(case when to_char(call_date,'mm')= x.mm then total_calls else 0 end) monthtodate,
sum(case when to_char(call_date,'yyyy')=
from pinkuray_tbl , x
group by rep
order by rep
ASKER
this is not giving me the proper result :
Bentz, Mark 0 0 427
Brady, Ryan 0 0 327
Bristol, Mary 0 0 1
Brogan, Christopher 0 0 346
Brown, Stephanie 0 0 194
Byrd, Francis 0 0 381
Where result should be:
Rep WeekToDate MonthToDate YearToDate
Bentz, Mark 107 427 5124
Brady, Ryan 82 327 3924
Bristol, Mary 0 1 12
Brogan, Christopher 87 346 4152
Brown, Stephanie 49 194 2328
Byrd, Francis 95 381 4572
Christine, Joe 108 433 5196
DeRosa, Roseann 116 465 5580
Fallorin, Jennilyn 150 599 7188
Gaynor, Paul 121 483 5796
Goffredo, Katie 106 424 5088
Kapetanakis, Kyle 86 343 4116
As the attached ffile have the target result for the Source data , So based on that file the data is not matching.
Bentz, Mark 0 0 427
Brady, Ryan 0 0 327
Bristol, Mary 0 0 1
Brogan, Christopher 0 0 346
Brown, Stephanie 0 0 194
Byrd, Francis 0 0 381
Where result should be:
Rep WeekToDate MonthToDate YearToDate
Bentz, Mark 107 427 5124
Brady, Ryan 82 327 3924
Bristol, Mary 0 1 12
Brogan, Christopher 87 346 4152
Brown, Stephanie 49 194 2328
Byrd, Francis 95 381 4572
Christine, Joe 108 433 5196
DeRosa, Roseann 116 465 5580
Fallorin, Jennilyn 150 599 7188
Gaynor, Paul 121 483 5796
Goffredo, Katie 106 424 5088
Kapetanakis, Kyle 86 343 4116
As the attached ffile have the target result for the Source data , So based on that file the data is not matching.
please understand the query you are running. i already told that it will take current month/current year/current week. so it is obvious that it will not bring data for current week and current month as we are in the end of november but your data is in october right ?
with x as ( select to_char(sysdate,'mm') mm,
to_char(sysdate,'yyyy') yy ,
to_char(sysdate,'ww') ww
from dual )
select rep,
sum(case when to_char(call_date,'ww')= x.ww then total_calls else 0 end) weektodate,
sum(case when to_char(call_date,'mm')= x.mm then total_calls else 0 end) monthtodate,
sum(case when to_char(call_date,'yyyy')= x.yy then total_calls else 0 end) yeartodate
from pinkuray_tbl , x
group by rep
order by rep
You gave me the excel with the output you wanted.
But did you tell me the logic on how to get those values at least for one record ? I had asked this already in my previous updates but you did not explain. Hence i came up with the query and told you that it is going to work with respect to current year, month and week as i do not get the logic what you need.
Please explain for one or two sample output records on how to arrive at those values and we can easily modify the query to get that output.
Thanks
with x as ( select to_char(sysdate,'mm') mm,
to_char(sysdate,'yyyy') yy ,
to_char(sysdate,'ww') ww
from dual )
select rep,
sum(case when to_char(call_date,'ww')= x.ww then total_calls else 0 end) weektodate,
sum(case when to_char(call_date,'mm')= x.mm then total_calls else 0 end) monthtodate,
sum(case when to_char(call_date,'yyyy')=
from pinkuray_tbl , x
group by rep
order by rep
You gave me the excel with the output you wanted.
But did you tell me the logic on how to get those values at least for one record ? I had asked this already in my previous updates but you did not explain. Hence i came up with the query and told you that it is going to work with respect to current year, month and week as i do not get the logic what you need.
Please explain for one or two sample output records on how to arrive at those values and we can easily modify the query to get that output.
Thanks
ASKER
Hi...
I am not sure how the calculation is taking place the only thing I have is the output i.e. extracted from external source.
where they also have the same data but the output was as the target data I have provided earlier.
The report i.e. we are getting is from external source where we don't have a any access.
If this is possible to do it then ok else I have to close this ticket as I dont have the calculation for how to find week to date , month to date and year to date ....
I am not sure how the calculation is taking place the only thing I have is the output i.e. extracted from external source.
where they also have the same data but the output was as the target data I have provided earlier.
The report i.e. we are getting is from external source where we don't have a any access.
If this is possible to do it then ok else I have to close this ticket as I dont have the calculation for how to find week to date , month to date and year to date ....
close it as i have no idea on what logic do i need to apply to get that data.
Thanks
Thanks
I would suggest to close this question by accepting these updates 34016597 , 33997743 , 33946965 as these were the ones which have got the text based stuff ( time ) stored into a numeric column through a trigger which eases the numerical calculations.
It is not advisible to delete this question as those 3 updates might be useful to someone on how to convert the text based time stuff into a numeric column in a table through a trigger.
It is not advisible to delete this question as those 3 updates might be useful to someone on how to convert the text based time stuff into a numeric column in a table through a trigger.
ASKER
Thanks Nav ,.... I am closing this as I dont have the formula for calculating the Week to day and like wise but thanks for youe help..