1

I have some problem to find median value in mysql.

There are two tables.

TABLE1(ID INT, PRICE1 INT, PRICE2 INT, PRICE3 INT)
TABLE2(ID INT, PRICE1 INT, PRICE2 INT)

I want to sort above table by price3 and I also want to find the median value of it. And I want to move ID, PRICE1, PRICE2 of the recode that have median PRICE3 to another table TABLE2. When the number of recode is even number, I want to choose the smallest value that is more than real median value.

First, I tried below method.

DECLARE midval INT;
DECLARE p1 INT;
DECLARE p2 INT;
SELECT COUNT(*)/2 INTO midval FROM TABLE1;
SELECT PRICE1, PRICE2 INTO p1, p2 FROM TABLE1 ORDER BY PRICE3 LIMIT midval, 1;
UPDATE TABLE2 SET PRICE1 = p1, PRICE2= p2;

But I couldn't work.

I heard about the dynamic query. So, I tried to it. But I couldn't fix the syntax error.

SET @midval = (SELECT COUNT(*)/2 FROM TABLE1);
SET @p1 = 0;
SET @p2 = 0;

SET @sql = N'SELECT PRICE1, PRICE2 INTO @p1, @p2 FROM TABLE1 ORDER BY PRICE3 LIMIT @midnum, 1';
EXEC sp_executesql @sql, N'@p1 INT OUTPUT, @p2 INT OUTPUT, @midval INT', @p1 OUTPUT, @p2 OUTPUT, @midval INT;

So, I tried very simple code of dynamic query. But syntax error is still remained.

DELIMITER //
DROP PROCEDURE IF EXISTS MEDIAN//
CREATE PROCEDURE MEDIAN()
BEGIN
    DECLARE @midval VARCHAR(11);
    DECLARE @sql NVARCHAR(200);
    SET @midval  = '0';
    SET @sql=' SELECT PRICE1 FROM TABLE1 limit @midval, 1';
    EXECUTE sp_executesql @sql, N'@midval VARCHAR(11)', @midval;
    RETURN;
END
//
DELIMITER ;

Thank you~!

Neo Kwon
  • 11
  • 2

0 Answers0