Ошибка MySQL "усеченное неверное значение DOUBLE" в процедуре

У меня проблема с моей процедурой. Я пытаюсь взять значения из таблицы продаж и сделать запрос, используя их. Процедура выглядит так:

DROP PROCEDURE IF EXISTS turnover;

DELIMITER $$

CREATE PROCEDURE turnover()
BEGIN
    DECLARE col INT;
    DECLARE q TEXT;
    DECLARE i INT DEFAULT 0;
    DECLARE m TEXT;
    SET col = (SELECT count(DISTINCT article) FROM sales);
    SET q = "SELECT article, ";
    WHILE i < co DO
        SET m = (SELECT DISTINCT month FROM sales LIMIT 1 OFFSET i);
        SET q = q + "SUM(IF(month=" + m + ",value,NULL)) AS " + m;
        IF i < (col - 1) THEN
            SET q = q + ", ";
        END IF;
        SET i = i + 1;
    END WHILE;
    SET q = q + " FROM sales GROUP BY article";
    EXECUTE q;
END$$

DELIMITER ;

CALL turnover();

Я получаю ошибку:

Код ошибки: 1292. Усеченное неверное значение DOUBLE: ',value,NULL)) AS '

Как я могу сделать это работает?

Благодарю.

2 ответа

Решение

col проблема была исправлена ​​или предположена ниже.

CREATE SCHEMA safe_Tuesday_01; -- safe sandbox
USE safe_Tuesday_01;    -- DO the work in this db to test it

-- a fake table, we need something
create table sales 
(   article varchar (100) not null,
    month int not null
);

Шаг 1, выясните, как выглядит строка:

DROP PROCEDURE IF EXISTS turnover;
DELIMITER $$
CREATE PROCEDURE turnover()
BEGIN
    DECLARE col INT;
    DECLARE q TEXT;
    DECLARE i INT DEFAULT 0;
    DECLARE m TEXT;
    SET col = (SELECT count(DISTINCT article) FROM sales);
    SET q = "SELECT article, ";
    WHILE i < col DO
        SET m = (SELECT DISTINCT month FROM sales LIMIT 1 OFFSET i);
        SET q = CONCAT(q,"SUM(IF(month=" + m + ",value,NULL)) AS ", m);
        IF i < (col - 1) THEN
            SET q = q + ", ";
        END IF;
        SET i = i + 1;
    END WHILE;
    SET q = CONCAT(q," FROM sales GROUP BY article");
    select q;
    -- EXECUTE q; -- No no no this is wrong anyway
END$$
DELIMITER ;

CALL turnover();

ВЫБРАТЬ артикул, ОТ ПРОДАЖ

Хорошо что выше SELECT выглядит не так жарко. Повторно исправьте свою логику на шаге 1, чтобы исправить эту строку.

Шаг 2, когда вы исправите приведенный выше код, перейдите к следующему. Обратите внимание, на данный момент это не исправлено. Так что, опять же, выше.

Но ниже используйте правильную PREPARED STATEMENT который ты не

DROP PROCEDURE IF EXISTS turnover;
DELIMITER $$
CREATE PROCEDURE turnover()
BEGIN
    DECLARE col INT;
    DECLARE q TEXT;
    DECLARE i INT DEFAULT 0;
    DECLARE m TEXT;
    SET col = (SELECT count(DISTINCT article) FROM sales);
    SET q = "SELECT article, ";
    WHILE i < col DO
        SET m = (SELECT DISTINCT month FROM sales LIMIT 1 OFFSET i);
        SET q = CONCAT(q,"SUM(IF(month=" + m + ",value,NULL)) AS ", m);
        IF i < (col - 1) THEN
            SET q = q + ", ";
        END IF;
        SET i = i + 1;
    END WHILE;
    SET q = CONCAT(q," FROM sales GROUP BY article");
    -- select q;
    SET @theSQL=q;
    PREPARE stmt1 FROM @theSQL;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
END$$
DELIMITER ;

Когда закончите,

DROP SCHEMA safe_Tuesday_01; -- clean up, poof, sandbox is gone

CONCAT твой друг. Вы пропустили этот шаг. Важно, чтобы PREPARE работает против пользовательской переменной (с @ знак), а не местный вар (из DECLARE) иначе оно взорвется. Так что я исправил это с помощью @theSQL

Снова, см. Страницу руководства MySQL ПОДГОТОВЬТЕ Синтаксис. Важно, чтобы ваша строка была правильной. В этом суть шага 1. Только тогда вы переходите к шагу 2 и используете его.

Бывает когда SELECT DISTINCT month FROM sales ничего не возвращает. На следующей строке фрагмент запроса генерируется как SUM(IF(month=,value,NULL)) AS и, конечно, там есть ошибка (возможно, MySQL не выдает правильное сообщение об ошибке, но именно здесь ошибка).

И причиной ошибки является WHILE линия, которая сравнивает i против неизвестной переменной co, Вероятно, следует читать:

WHILE i < col DO

Но это не решает проблему, потому что col это число различных значений article и вы перебираете от 1 до col над различными значениями month, Скорее всего, они в разном количестве, и если количество статей будет больше, тогда ошибка повторится.

Другие вопросы по тегам