首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据sql中另一列中的值递增的值

根据sql中另一列中的值递增的值
EN

Stack Overflow用户
提问于 2015-01-16 19:19:12
回答 1查看 576关注 0票数 2

我有一个表,其中包含service_id、service_name、weight_start_range、Weight_end_range和increment_by。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

有人能在这方面帮我吗?

我无法设计表格,所以附加了图像来查看结构。

EN

回答 1

Stack Overflow用户

发布于 2015-01-16 21:06:01

考虑到您的需求,我首先想到的是编写一个子查询,但在那里提供循环功能是一项复杂的任务,因此我决定为它创建过程。

DB安装程序:

代码语言:javascript
复制
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

种子数据:

代码语言:javascript
复制
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表包含以下数据:

代码语言:javascript
复制
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

PROCEDURE customOutPut :

代码语言:javascript
复制
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中可用的数据,请执行以下操作:

代码语言:javascript
复制
SELECT * FROM `data_spread_with_increment_by`

表data_spread_with_increment_by

代码语言:javascript
复制
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

我提供了这个过程作为指导,我可能遗漏了一些边缘案例,但我相信您肯定能弄清楚它们。

无论这个程序对你是否有效,请发表你的建议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27982844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档