SQL数据库编程大赛(第四期)(一)

2014-11-24 10:16:22 · 作者: · 浏览: 2

本期题目:
某项房产资源服务按天数、人数收费。收费标准与那一天的用户数有关,对于来自同一个房产经纪公司的用户,某天的总用户数越多则折扣越多。


CODE:
CREATE TABLE services ( -------- 各项服务
service_id NUMBER PRIMARY KEY
,service_name VARCHAR2(20)
);
CREATE TABLE companies ( -------- 使用服务的公司
company_id NUMBER PRIMARY KEY
,company_name VARCHAR2(40)
);

CREATE TABLE service_users ( -------公司下的用户(房产经纪)
user_id NUMBER PRIMARY KEY
,company_id NUMBER NOT NULL REFERENCES companies(company_id)
,user_name VARCHAR2(20)
);
CREATE TABLE service_usage (
------- 使用情况,起止日为闭合区间(首尾包含),如果只用一天,则start_date=end_date
------ 该表为大表,数据较多
usage_id NUMBER PRIMARY KEY
,user_id NUMBER NOT NULL REFERENCES service_users(user_id)
,service_id NUMBER NOT NULL REFERENCES services(service_id)
,start_date DATE NOT NULL -------- 数据只含日期,不含时间
,end_date DATE NOT NULL -------- 数据只含日期,不含时间
,CONSTRAINT check_dates CHECK (end_date>=start_date)
);
CREATE TABLE service_rates ( -------收费标准,每个公司各不相同, 按人数段计费
service_id NUMBER NOT NULL REFERENCES services(service_id)
,company_id NUMBER NOT NULL REFERENCES companies(company_id)
,category_id NUMBER NOT NULL ------ 1,2,3,4表示1档,2档,3档,4档
,user_count_min NUMBER NOT NULL ------ 该档人数下限,1档从1开始
,user_count_max NUMBER NOT NULL ------ 该档人数上限,同样是闭合区间。最后一档不妨设为99999999
,rate NUMBER NOT NULL ------ 该档的费率,乘以天数再乘以人数就是总费用
,PRIMARY KEY (company_id,service_id,category_id)
);
输入:
起止日期(yyyymmdd字符串), 闭合区间(首尾包含), 如果只计算一天,则p_start_date=p_end_date
绑定变量:
VAR p_start_date VARCHAR2(8);
VAR p_end_date VARCHAR2(8);
输出:费用报表
company_id,company_name,service_id,service_name,fee1,fee2,fee3,fee4,total_fee
其中:fee1,fee2,fee3,fee4分别表示1档,2档,3档,4档的费用,total_fee是上述4项的总和。若存在某档无数据,则总和为NULL。
按照company_id,service_id排序(升序)。

测试数据:

CODE:

INSERT INTO services VALUES(1,Service A);
INSERT INTO services VALUES(2,Service B);
INSERT INTO services VALUES(3,Service C);
INSERT INTO companies VALUES(1,company A);
INSERT INTO companies VALUES(2,company B);
INSERT INTO companies VALUES(3,company C);
INSERT INTO service_users VALUES(101,1,User 1 Comp A);
INSERT INTO service_users VALUES(102,1,User 2 Comp A);
INSERT INTO service_users VALUES(103,1,User 3 Comp A);
INSERT INTO service_users VALUES(104,1,User 4 Comp A);
INSERT INTO service_users VALUES(201,2,User 1 Comp B);
INSERT INTO service_users VALUES(202,2,User 2 Comp B);
INSERT INTO service_users VALUES(203,2,User 3 Comp B);
INSERT INTO service_users VALUES(204,2,User 4 Comp B);
INSERT INTO service_users VALUES(301,3,User 1 Comp C);
INSERT INTO service_users VALUES(302,3,User 2 Comp C);
INSERT INTO service_users VALUES(303,3,User 3 Comp C);
insert into service_rates values (1,1,1,1,1,20);
insert into service_rates values (1,1,2,2,2,15);
insert into service_rates values (1,1,3,3,3,10);
insert into service_rates values (1,1,4,4,99999999,5);
insert into service_rates values (2,1,1,1,1,30);
insert into service_rates values (2,1,2,2,2,25);
insert into service_rates values (2,1,3,3,3,20);
insert into service_rates values (2,1,4,4,99999999,15);
insert into service_rates values (1,2,1,1,1,22);
insert into service_rates values (1,2,2,2,2,17);
insert into service_rates values (1,2,3,3,3,12);
insert into service_rates values (1,2,4,4,99999999,8);
insert into service_