【问题标题】:concat result values from pivoting mysql连接来自旋转 mysql 的结果值
【发布时间】:2019-07-01 04:22:51
【问题描述】:

我试图在旋转后得到一个串联的字符串值。

目前,只有一个值并且工作正常。

这是查询:

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

【问题讨论】:

  • 我建议您在第一个查询(SELECT ... INTO @SQL)之后添加一个SELECT @SQL 并注释掉其余的过程,以便您可以看到您正在执行的实际查询是什么。
  • 但是为什么要跳过所有这些错综复杂的箍呢?为什么不简单地处理某种应用程序代码中的显示问题?
  • @Strawberry,这不是显示问题。我希望它们连接起来,只需遵循要求。
  • 当然这是一个显示问题——如果你不“看”它们,你就不会关心结果的格式!
  • @Strawberry,这就是我require 的结果......

标签: mysql sql concat group-concat


【解决方案1】:

当您在CONCAT 中包含, 时,您的代码不起作用的原因是因为CONCATSUM 内,它无法将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`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2018-08-07
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多