我有一个表,其中包含service_id、service_name、weight_start_range、Weight_end_range和increment_by。
service_id service_name weight_start_range Weight_end_range increment_by
sr1 Service1 0 500 100
sr2 Service2 200 300 0
sr3 Service3 0 1000 500
sr4 Service4 0 250 0
sr5 Service5 50 100 0service_id service_name weight_start_range Weight_end_range
sr1 Service1 0 100
sr1 Service1 100 200
sr1 Service1 200 300
sr1 Service1 300 400
sr1 Service1 400 500
sr2 Service2 200 300
sr3 Service3 0 500
sr3 Service3 500 1000
sr4 Service4 0 250
sr5 Service5 50 100有人能在这方面帮我吗?
我无法设计表格,所以附加了图像来查看结构。

发布于 2015-01-16 21:06:01
考虑到您的需求,我首先想到的是编写一个子查询,但在那里提供循环功能是一项复杂的任务,因此我决定为它创建过程。
DB安装程序:
CREATE TABLE `servicedata` (
`service_id` varchar(255) NOT NULL,
`serviceName` varchar(255) DEFAULT NULL,
`weight_start_range` double DEFAULT NULL,
`weight_end_range` double DEFAULT NULL,
`increment_by` double DEFAULT NULL,
PRIMARY KEY (`service_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1种子数据:
insert into `servicedata` (`service_id`, `serviceName`, `weight_start_range`, `weight_end_range`, `increment_by`) values('sr1','srvice1','0','500','100');
insert into `servicedata` (`service_id`, `serviceName`, `weight_start_range`, `weight_end_range`, `increment_by`) values('sr2','service2','200','300','0');
insert into `servicedata` (`service_id`, `serviceName`, `weight_start_range`, `weight_end_range`, `increment_by`) values('sr3','service3','0','1000','500');
insert into `servicedata` (`service_id`, `serviceName`, `weight_start_range`, `weight_end_range`, `increment_by`) values('sr4','service4','0','250','0');servicedata表包含以下数据:
service_id serviceName weight_start_range weight_end_range increment_by
---------- ----------- ------------------ ---------------- ------------
sr1 srvice1 0 500 100
sr2 service2 200 300 0
sr3 service3 0 1000 500
sr4 service4 0 250 0PROCEDURE customOutPut :
DELIMITER //
DROP PROCEDURE IF EXISTS customOutPut//
CREATE PROCEDURE customOutPut()
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE serviceid VARCHAR(50) ;
DECLARE servicename VARCHAR(50) ;
DECLARE START INTEGER ;
DECLARE END INTEGER ;
DECLARE incrementby INTEGER ;
DECLARE WEIGHT_END INTEGER DEFAULT 0;
DECLARE endRange INTEGER;
DECLARE startRange INTEGER;
DECLARE selectCursor CURSOR FOR
SELECT service_id,servicename , weight_START_range , weight_end_range ,increment_by
FROM servicedata;
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;
DROP TABLE IF EXISTS DATA_SPREAD_WITH_INCREMENT_BY ;
CREATE TABLE DATA_SPREAD_WITH_INCREMENT_BY(service_id VARCHAR(50) ,servicename VARCHAR(50), weight_START_range INTEGER, weight_end_range INTEGER );
OPEN selectCursor;
getData: LOOP
FETCH selectCursor INTO serviceid,servicename,START,END,incrementby ;
IF v_finished =1 THEN
LEAVE getData;
END IF ;
IF incrementby = 0 THEN
INSERT INTO DATA_SPREAD_WITH_INCREMENT_BY VALUES (serviceid,servicename,START,END);
ELSE
SET endRange =START;
SET startRange = START;
spreadData: LOOP
SET endRange = endRange+incrementby ;
IF endrange > END THEN
LEAVE spreadData;
END IF;
INSERT INTO DATA_SPREAD_WITH_INCREMENT_BY VALUES (serviceid,servicename,startRange,endRange);
SET startRange = startRange+incrementby ;
END LOOP;
END IF ;
END LOOP getData;
END //
DELIMITER ;您应该以CALL customOutPut()的身份调用该过程
要查看data_spread_with_increment_by fire下面的SQL中可用的数据,请执行以下操作:
SELECT * FROM `data_spread_with_increment_by`表data_spread_with_increment_by
service_id servicename weight_START_range weight_end_range
---------- ----------- ------------------ ----------------
sr1 (NULL) 0 100
sr1 (NULL) 100 200
sr1 (NULL) 200 300
sr1 (NULL) 300 400
sr1 (NULL) 400 500
sr2 (NULL) 200 300
sr3 (NULL) 0 500
sr3 (NULL) 500 1000
sr4 (NULL) 0 250我提供了这个过程作为指导,我可能遗漏了一些边缘案例,但我相信您肯定能弄清楚它们。
无论这个程序对你是否有效,请发表你的建议。
https://stackoverflow.com/questions/27982844
复制相似问题