Конкретные значения результата от поворота MySQL - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь получить объединенное строковое значение после поворота.

В настоящее время есть только одно значение и работает нормально.

Вот запрос:

DROP PROCEDURE IF EXISTS getAllUserLunchReport;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `getAllUserLunchReport`(IN `start_date` DATETIME, IN `end_date` DATETIME)
BEGIN

SET GLOBAL group_concat_max_len=4294967295;
SET @SQL = NULL;
SET @start_date = DATE(start_date);
SET @end_date = DATE(end_date);

    SELECT
    COALESCE(GROUP_CONCAT(DISTINCT
    CONCAT(
    'SUM(CASE WHEN date = "',DATE(issuedDateTime),'" AND lunchStatus = 1 THEN (SELECT CONCAT((SELECT rate FROM lunch_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1), "," ,(SELECT rate FROM lunch_gbd_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1))) ELSE 0 END) AS `',DATE(issuedDateTime),'`'
    ) ORDER BY issuedDateTime
), '0 as `NoMatchingRows`') INTO @SQL

        FROM `lunch_status` 
        WHERE DATE(issuedDateTime) BETWEEN @start_date AND @end_date;

    SET @SQL 
    = CONCAT
    (
    '
        SELECT concat(u.firstname," ",u.lastname) as Employee, w.*
        FROM users u
        INNER JOIN
        (SELECT userId, ', @SQL, ' 
        FROM
        (
            SELECT userId, lunchStatus, DATE(issuedDateTime) as date 
            FROM `lunch_status` 
            WHERE DATE(issuedDateTime) BETWEEN "',@start_date,'" AND "',@end_date,'" 
        ) as a
        GROUP BY userId) w
        ON u.id = w.userId
        ORDER BY Employee;
    '
    );

PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


END$$
DELIMITER ;

Я получаю только первое значение без другого значения, которое пытаюсь объединить.

Вот как я ожидал результата:

employee    |   2019-1-15  |  2019-1-16
----------------------------------------
Jack        |   30,140     |  30,140

Хотя выполнение запроса на конкатенацию выполняется отдельно.

ПРИМЕЧАНИЕ: в хранимой процедуре выше значения объединяются, если разделитель удален.CONCAT((select ...), (select...)) дает 30140.

Может быть, проблема с quotes, но я пытался всеми способами.

К вашему сведению, вот что @SQL дает после первого запроса:

SUM(CASE WHEN date = "2019-01-15" AND lunchStatus = 1 THEN (SELECT CONCAT((SELECT rate FROM lunch_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1), ",", (SELECT rate FROM lunch_gbd_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1))) ELSE 0 END) AS `2019-01-15`,
SUM(CASE WHEN date = "2019-01-16" AND lunchStatus = 1 THEN (SELECT CONCAT((SELECT rate FROM lunch_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1), ",", (SELECT rate FROM lunch_gbd_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1))) ELSE 0 END) AS `2019-01-16`

выглядит корректно.

РЕДАКТИРОВАТЬ: кажется, что он работает нормально с "целыми" значениями.например,

CONCAT((SELECT rate FROM lunch_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1), "111" ,(SELECT rate FROM lunch_gbd_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1))

дает 301140.

Но с другими символами ,/./-/_ отображается только первый параметр: 30.

1 Ответ

0 голосов
/ 07 февраля 2019

Причина, по которой ваш код не работает, когда вы включаете , в CONCAT, заключается в том, что CONCAT находится внутри SUM, и он не сможет интерпретировать 30,140 какчисло, где он может сделать это для 30140 (следовательно, без разделителя вы получите результат).Не зная более подробной информации о ваших данных таблицы и желаемых результатах, трудно сказать точно, как решить проблему, но, возможно, вы хотите что-то вроде этого:

CASE WHEN date = "2019-01-15" AND lunchStatus = 1 THEN CONCAT((SELECT SUM(rate) FROM lunch_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1), ",", (SELECT SUM(rate) FROM lunch_gbd_rate WHERE DATE(created_on) <= date ORDER BY created_on DESC LIMIT 1)) ELSE 0 END) AS `2019-01-15`
...