2015-01-16 6 views
2

service_id, service_name, weight_start_range, Weight_end_range 및 increment_by가 포함 된 테이블이 하나 있습니다.SQL의 다른 열의 값을 기준으로 증가 값

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    0 

나는이 테이블에서 데이터를 얻을 SQL 쿼리를 사용으로 하나 개의 테이블을 만들려면 :

service_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 

이 사람이 나를 도와 줄 수

?

구조를보기 위해 이미지를 첨부하는 테이블을 디자인 할 수 없었습니다. enter image description here

+0

팁 : 실제로 MySQL에서이 작업을 수행 할 수 있지만 그 방법은 상상할 수 있지만 응용 프로그램에서 수행하십시오. 테이블을 읽고이를 기반으로 SQL을 생성 한 다음 실행하여 결과를 얻습니다. 이 문제를 SQL로 해결하는 것은 학문적 인 관심을 충족시키는 목적에 부합하지만 제작 목적으로는하지 않습니다. –

답변

0

내 생각에 처음 생각해 보니 서브 쿼리 작성에 대한 생각이 들었지 만 루핑 기능을 제공하는 것은 복잡한 작업 이었으므로 이에 대한 절차를 작성하기로 결정했습니다.

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 화재에서 사용할 수 등의 데이터를 볼 수 있습니다

나는이 지침을 지침으로 제공해 주었고 몇 가지 모호한 사례를 놓쳤을 지 모르지만 확실히 알아낼 수있을 것이라고 확신한다.

이 절차가 효과가 있는지 여부를 알려주십시오.

+0

고마워 슈리. 나는 프로 시저를 시도하고 잘 작동하지만 우리는 SQL에서만 그것을 할 수 있습니다. – suraj08

관련 문제