diteps06
asked on
Calculate number of days between months avoiding oracle analytic functions
I will like to know how can I calculate the differences of two dates in a table avoiding the use of Oracle analytic functions and subqueries.
I have a table of product sales and I will like to know how sales have been going eversince consumers started buying it(Table 1). I need to get the minimum date of each product when sales started and subtract it from successive dates and show the relative sale. I know I can achieve it using analytic functions like ( DENSE_RANK FIRST ORDER BY) or subqueries. If possible I will like to avoid it . The result I will like to have is available in Table 2
Period Prod Sale
200810 ref 2
200811 ain 6
200811 ref 3
200812 ain 7
200812 del 3
200901 ain 9
200901 ref 5
200901 del 4
Table 1
Here is the result I will like to expect.
Prod Period Min_Date Month_Diff Sale
ref 200810 200810 0 2
ain 200811 200811 0 6
ref 200811 200810 1 3
ain 200812 200811 1 7
del 200812 200812 0 3
ref 200901 200810 3 5
del 200901 200812 4 5
Table 2
DB: Oracle 10g
I have a table of product sales and I will like to know how sales have been going eversince consumers started buying it(Table 1). I need to get the minimum date of each product when sales started and subtract it from successive dates and show the relative sale. I know I can achieve it using analytic functions like ( DENSE_RANK FIRST ORDER BY) or subqueries. If possible I will like to avoid it . The result I will like to have is available in Table 2
Period Prod Sale
200810 ref 2
200811 ain 6
200811 ref 3
200812 ain 7
200812 del 3
200901 ain 9
200901 ref 5
200901 del 4
Table 1
Here is the result I will like to expect.
Prod Period Min_Date Month_Diff Sale
ref 200810 200810 0 2
ain 200811 200811 0 6
ref 200811 200810 1 3
ain 200812 200811 1 7
del 200812 200812 0 3
ref 200901 200810 3 5
del 200901 200812 4 5
Table 2
DB: Oracle 10g
why are you trying to avoid analytic functions?
ASKER
The reason is that there will be a group by in the final query and analytic functions aren't compatible with it
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
A few questions.
Why is there no record for product ain for period 200901 in your expected results?
Why do you show a month_diff of 4 and a sale of 5 for prod del for period 200901 and a min_date of 200812 in your expected results?
What do you gain with a group by statement in your final query that can't be accomplished with a partition by clause in an analytical query?
Why is there no record for product ain for period 200901 in your expected results?
Why do you show a month_diff of 4 and a sale of 5 for prod del for period 200901 and a min_date of 200812 in your expected results?
What do you gain with a group by statement in your final query that can't be accomplished with a partition by clause in an analytical query?
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
"Why is there no record for product ain for period 200901 in your expected results?"
Sorry ain had to be in the expected result
"Why do you show a month_diff of 4 and a sale of 5 for prod del for period 200901"
Sorry again for the error
" and a min_date of 200812 in your expected results?"
del has minimum date 200812 is the first record in the table. The minimum date represents the first month is starts its sale which is the first time it appears in the table.
There can be a month where there is no sale (ref in 200812)
Here is the updated version of the expected result:
Prod Period Min_Date Month_Diff Sale
ref 200810 200810 0 2
ain 200811 200811 0 6
ref 200811 200810 1 3
ain 200812 200811 1 7
del 200812 200812 0 3
ref 200901 200810 3 5
del 200901 200812 1 4
ain 200901 200811 2 9
Table 2
"What do you gain with a group by statement in your final query that can't be accomplished with a partition by clause in an analytical query?"
The monthly is a sum of the daily sales. In the query I have to use SUM to get the total in a month. Consequently there will be a group by clause.
Group by clause and analytic functions aren't compatible.
If there are no other alternative we can try subqueries.
Sorry ain had to be in the expected result
"Why do you show a month_diff of 4 and a sale of 5 for prod del for period 200901"
Sorry again for the error
" and a min_date of 200812 in your expected results?"
del has minimum date 200812 is the first record in the table. The minimum date represents the first month is starts its sale which is the first time it appears in the table.
There can be a month where there is no sale (ref in 200812)
Here is the updated version of the expected result:
Prod Period Min_Date Month_Diff Sale
ref 200810 200810 0 2
ain 200811 200811 0 6
ref 200811 200810 1 3
ain 200812 200811 1 7
del 200812 200812 0 3
ref 200901 200810 3 5
del 200901 200812 1 4
ain 200901 200811 2 9
Table 2
"What do you gain with a group by statement in your final query that can't be accomplished with a partition by clause in an analytical query?"
The monthly is a sum of the daily sales. In the query I have to use SUM to get the total in a month. Consequently there will be a group by clause.
Group by clause and analytic functions aren't compatible.
If there are no other alternative we can try subqueries.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
"select sum(daily_sales) over (partition by prod, period order by period) as monthly_sales"
will create a sum of daily_sales for each prod and period without requiring a group by clause.
will create a sum of daily_sales for each prod and period without requiring a group by clause.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
B penalty grade is not appropriate here, please explain or RA for moderator to correct.
ASKER
RA