Получить и добавить значение следующего столбца строки в первый столбец строки - PullRequest
0 голосов
/ 03 июля 2019

У меня есть таблица базы данных, которая, как показано ниже enter image description here

Я хочу добавить каждый столбец SoldD в следующую строку ValT столбец. например, результат запроса для данной таблицы должен быть как enter image description here

Приведенный выше снимок предназначен для ожидаемых результатов

так что я пробовал много вещей, но не смог получить ожидаемых результатов

Неудачная попытка 1:

SELECT *,(IFNULL((SELECT VaIT from saleorder s WHERE s.id > ss.id limit 1),0)+ss.SoldD) FROM `saleorder` ss

Неудачная попытка 2:

update saleorder SET SoldD=(IFNULL((SELECT VaIT from (SELECT * from saleorder WHERE id > id+1 limit 1) s),0)+SoldD)

Любая помощь высоко ценится, заранее спасибо!

1 Ответ

1 голос
/ 03 июля 2019

Версия MySql:

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`()
BEGIN
    DECLARE id2 INT DEFAULT 0;
    declare VALT2 INT DEFAULT 0;
    declare soldD2 INT DEFAULT 0;
    declare beforSo2 INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR SELECT Id, ValT, SoldD FROM saleorder ORDER BY id;
    OPEN cur1;
    FETCH cur1 INTO id2, VALT2, soldD2;
    SET valT2 = soldD2;
    x: LOOP
        IF(valT2 IS NULL) THEN
            SET valT2 = 0;
        END IF;
        IF(beforSo2 IS NULL) THEN
            SET beforSo2 = 0;
        END IF;

        UPDATE saleorder
        SET SoldD = beforSo2 + valT2
        WHERE ID = id2;

        SET beforSo2 = beforSo2 + valT2;
        FETCH cur1 INTO id2, VALT2, soldD2;
    END LOOP;
    CLOSE cur1;
END

Затем вызовите процедуру следующим образом:

CALL new_procedure;

Версия SqlServer:

DECLARE db_cursor CURSOR FOR SELECT ID, ValT, SoldD FROM Table_2 ORDER BY ID; 
DECLARE @ID INT;
DECLARE @valT  INT;
DECLARE @soldD INT;
DECLARE @beforSoldD INT = 0;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @ID, @valT, @soldD;
SET @valT = @soldD;
WHILE @@FETCH_STATUS = 0  
BEGIN
    IF(@valT IS NULL)
        SET @valT = 0;
    IF(@beforSoldD IS NULL)
        SET @beforSoldD = 0;

    UPDATE Table_2
    SET SoldD = @beforSoldD + @valT
    WHERE ID = @ID;

    SET @beforSoldD = @beforSoldD + @valT;

    FETCH NEXT FROM db_cursor INTO @ID, @valT, @soldD;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;

Базовые данные:

enter image description here

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...