내 생각에 처음 생각해 보니 서브 쿼리 작성에 대한 생각이 들었지 만 루핑 기능을 제공하는 것은 복잡한 작업 이었으므로 이에 대한 절차를 작성하기로 결정했습니다.
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
SEED 데이터 :
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 0
절차의 customOutPut : 당신은 CALL 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 ;
는
SELECT * FROM `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
data_spread_with_increment_by SQL
아래 data_spread_with_increment_by 화재에서 사용할 수 등의 데이터를 볼 수 있습니다
나는이 지침을 지침으로 제공해 주었고 몇 가지 모호한 사례를 놓쳤을 지 모르지만 확실히 알아낼 수있을 것이라고 확신한다.
이 절차가 효과가 있는지 여부를 알려주십시오.
팁 : 실제로 MySQL에서이 작업을 수행 할 수 있지만 그 방법은 상상할 수 있지만 응용 프로그램에서 수행하십시오. 테이블을 읽고이를 기반으로 SQL을 생성 한 다음 실행하여 결과를 얻습니다. 이 문제를 SQL로 해결하는 것은 학문적 인 관심을 충족시키는 목적에 부합하지만 제작 목적으로는하지 않습니다. –