|
我们翻译的27
- VAR p_start_date VARCHAR2(8);
- VAR p_end_date VARCHAR2(8);
- EXEC :p_start_date := '&&p_start_date';
- EXEC :p_end_date := '&&p_end_date';
- with
- journal(usage_id, user_id, service_id, service_date, balance) as
- (
- select usage_id, user_id, service_id,
- case when start_date < TO_DATE(:p_start_date,'YYYYMMDD') then 1
- else start_date-TO_DATE(:p_start_date,'YYYYMMDD') +1 end service_date,
- 1 balance
- from service_usage
- where end_date >= TO_DATE(:p_start_date,'YYYYMMDD')
- and start_date <= TO_DATE(:p_end_date,'YYYYMMDD')
- union
- select usage_id, user_id, service_id,
- case when end_date > TO_DATE(:p_end_date,'YYYYMMDD')
- then TO_DATE(:p_end_date,'YYYYMMDD')-TO_DATE(:p_start_date,'YYYYMMDD')
- else end_date-TO_DATE(:p_start_date,'YYYYMMDD')+2 end service_date,
- -1 balance
- from service_usage
- where end_date >= TO_DATE(:p_start_date,'YYYYMMDD')
- and start_date <= TO_DATE(:p_end_date,'YYYYMMDD')
- )
- ,
- balance(company_id, service_id, service_date, balance) as
- (
- select service_users.company_id,
- journal.service_id,
- journal.service_date,
- sum(journal.balance) balance
- from
- (
- select j1.user_id, j1.service_id, j1.service_date,
- min(j1.balance) balance, sum(j2.balance) accumulate
- from journal j1, journal j2
- where j1.user_id = j2.user_id
- and j1.service_id = j2.service_id
- and (j1.service_date > j2.service_date
- or (j1.service_date = j2.service_date and j1.usage_id >= j2.usage_id))
- group by j1.user_id, j1.service_id, j1.service_date, j1.usage_id
- having (min(j1.balance) = 1 and sum(j2.balance) = 1)
- or (min(j1.balance) = -1 and sum(j2.balance) = 0)
- ) journal left join service_users on journal.user_id = service_users.user_id
- group by service_users.company_id, journal.service_id, journal.service_date
- )
- ,
- fee (company_id, service_id, category_id, balance, days, rate) as
- (
- select
- company_summary.company_id,
- company_summary.service_id,
- service_rates.category_id,
- company_summary.previous_balance,
- company_summary.service_date - company_summary.previous_date days,
- service_rates.rate
- from
- (
- select b1.company_id, b1.service_id, b1.service_date,
- b1.balance balance,
- max(b2.service_date) previous_date,
- sum(b2.balance) previous_balance
- from balance b1, balance b2
- where b1.company_id = b2.company_id
- and b1.service_id = b2.service_id
- and b1.service_date > b2.service_date
- group by b1.company_id, b1.service_id, b1.service_date, b1.balance
- ) company_summary join service_rates
- on company_summary.company_id = service_rates.company_id
- and company_summary.service_id = service_rates.service_id
- and company_summary.previous_balance >= service_rates.user_count_min
- and company_summary.previous_balance <= service_rates.user_count_max
- where company_summary.previous_date is not null
- )
- ,
- summary(company_id, company_name, service_id, service_name, category_id, fee) as
- (
- select fee.company_id,
- companies.company_name,
- fee.service_id,
- services.service_name,
- fee.category_id,
- fee.fee from
- (
- select fee.company_id,
- fee.service_id,
- category_id,
- sum(balance * days * rate) fee
- from fee
- group by fee.company_id, fee.service_id, category_id
- ) fee
- left join companies on fee.company_id = companies.company_id
- left join services on fee.service_id = services.service_id
- )
- select company_id, company_name,
- service_id, service_name,
- sum(decode(category_id,1,fee)) fee1,
- sum(decode(category_id,2,fee)) fee2,
- sum(decode(category_id,3,fee)) fee3,
- sum(decode(category_id,4,fee)) fee4,
- sum(fee) feetotal
- from summary
- group by company_id, company_name,
- service_id, service_name
- ;
复制代码 |
|