如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?

Posted

技术标签:

【中文标题】如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?【英文标题】:How can I use an IF or Case function to summarize a GROUP_CONCAT column? AND then apply it to the original data table? 【发布时间】:2021-11-16 13:05:59 【问题描述】:

我是 mysql 的新手,希望得到任何指点 - 这里的目标是以某种方式使用 GROUP_CONCAT 自动化分类字段,然后在 new_column 中总结 GROUP_CONCAT 字段中的某些模式。此外,是否可以在一次查询中将 new_column 添加到原始表中?以下是我尝试过的方法,如果有帮助,则会出现未知列“代码”的错误:

SELECT 
    `ID`,
    `Code`,
    GROUP_CONCAT(DISTINCT `Code` ORDER BY `Code` ASC SEPARATOR ", ") AS `Codes`,
    IF(`Codes` LIKE '123%', 'Description1',
        IF(`Codes` = '123, R321', 'Description2', 
            "Logic Needed"))
FROM Table1
GROUP BY `ID`

我想用 CASE 语句代替嵌套的 if 语句。原因是我已经有大约 1000 行逻辑已经写成“如果 [列] =”?可能是这样的:

SELECT 
    `ID`,
    `Code`,
    GROUP_CONCAT(DISTINCT `Code` ORDER BY `Code` ASC SEPARATOR ", ") AS `Codes`,
    CASE
        WHEN `Codes` LIKE '123%' THEN 'Description1'
        WHEN `Codes` = '123, R321' THEN 'Description2'
        ELSE "Logic Needed"
    END
FROM Table1
GROUP BY `ID`

表格示例:

ID,Code
1,R321
1,123
2,1234
3,1231
4,123
4,R321

完成表:

ID,Codes,New_Column
1,"123, R321",Description2
2,1234,Description1
3,1231,Description1
4,"123, R321",Description2

那么如何将汇总数据添加回原始表格?

决赛桌:

ID,Code,New_Column
1,R321,Description2
1,123,Description2
2,1234,Description1
3,1231,Description1
4,123,Description2
4,R321,Description2

谢谢。

【问题讨论】:

您使用了不正确的条件顺序。当Codes = '123, R321' 也匹配Codes LIKE '123%' - 因此永远不会选择第二个选项。交换它们(始终将详细模式放在常见模式之前)。 很好,这在技术上是我的一个发布错误。一定会考虑到我的项目。谢谢,Akina。 【参考方案1】:

您不能在同一查询中引用列别名。需要在子查询中做GROUP_CONCAT(),然后主查询可以参考Codes总结一下。

选择Code 也没有意义,因为组中没有单个Code 值。

SELECT ID, Codes, 
    CASE
        WHEN `Codes` = '123, R321' THEN 'Description2'
        WHEN `Codes` LIKE '123%' THEN 'Description1'
        ELSE "Logic Needed"
    END AS New_Column
FROM (
    SELECT 
        `ID`,
        GROUP_CONCAT(DISTINCT `Code` ORDER BY `Code` ASC SEPARATOR ", ") AS `Codes`
    FROM Table1
    GROUP BY ID
) AS x

正如评论中提到的,WHEN 子句是按顺序测试的,因此您需要先放置更具体的案例。您可能想要使用FIND_IN_SET() 而不是LIKE,因为123% 将匹配1234,而不仅仅是123, something

【讨论】:

太棒了,巴马尔。我会尽快测试并让你知道。此外,对于 CASE 语句的排序 - 我完全理解;我重写了我的示例以使 ASC 有意义,并且没有重新排序 WHEN 语句。非常感谢您的时间和帮助。

以上是关于如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在spark sql lag函数中添加if或case条件

MySQL:如何使用 CASE 或 IF 匹配较短的列的长度?

选择“case when”...产生分组结果...如何获取汇总数据?

SQL函数汇总

SQL函数汇总

MySQL数据行怎么转为列