当前位置: 首页 > 面试题库 >

SQL GROUP_CONCAT分为不同的列

暴乐邦
2023-03-14
问题内容

我进行了很多搜索,但没有找到解决我问题的合适方法。

我要怎么办

我在MySQL中有2个表格:-国家-货币(由于多对多关系,我通过CountryCurrency将它们连接在一起->)

参见以下示例:http :
//sqlfiddle.com/#!2/317d3/8/0

我想使用联接将两个表链接在一起,但我想每个国家/地区仅显示一行(某些国家/地区使用多种货币,因此这是第一个问题)。

我找到了group_concat函数:

SELECT country.Name, country.ISOCode_2, group_concat(currency.name) AS currency
FROM country
INNER JOIN countryCurrency ON country.country_id = countryCurrency.country_id
INNER JOIN currency ON currency.currency_id = countryCurrency.currency_id
GROUP BY country.name

结果如下:

NAME            ISOCODE_2   CURRENCY

Afghanistan AF          Afghani
脜land Islands   AX          Euro
Albania         AL          Lek
Algeria         DZ          Algerian Dinar
American Samoa  AS          US Dollar,Kwanza,East Caribbean Dollar

但是我现在想要的是将货币拆分为不同的列(货币1,货币2,…)。我已经尝试过MAKE_SET()之类的功能,但这不起作用。


问题答案:

您可以使用substring_index()。以下查询将您的查询用作子查询,然后应用此逻辑:

select Name, ISOCode_2,
       substring_index(currencies, ',', 1) as Currency1,
       (case when numc >= 2 then substring_index(substring_index(currencies, ',', 2), ',', -1) end) as Currency2,
       (case when numc >= 3 then substring_index(substring_index(currencies, ',', 3), ',', -1) end)  as Currency3,
       (case when numc >= 4 then substring_index(substring_index(currencies, ',', 4), ',', -1) end)  as Currency4,
       (case when numc >= 5 then substring_index(substring_index(currencies, ',', 5), ',', -1) end)  as Currency5,
       (case when numc >= 6 then substring_index(substring_index(currencies, ',', 6), ',', -1) end)  as Currency6,
       (case when numc >= 7 then substring_index(substring_index(currencies, ',', 7), ',', -1) end)  as Currency7,
       (case when numc >= 8 then substring_index(substring_index(currencies, ',', 8), ',', -1) end)  as Currency8
from (SELECT country.Name, country.ISOCode_2, group_concat(currency.name) AS currencies,
             count(*) as numc
      FROM country
      INNER JOIN countryCurrency ON country.country_id = countryCurrency.country_id
      INNER JOIN currency ON currency.currency_id = countryCurrency.currency_id
      GROUP BY country.name
     ) t

该表达式substring_index(currencies, ',' 2)采用货币列表,直到第二个货币为止。对于美属索莫亚,那就是'US Dollar,Kwanza'。使用-1参数作为下一个调用时,将使用列表的最后一个元素,即'Kwanza',这是的第二个元素currencies

还要注意,SQL查询返回一组定义明确的列。查询不能具有可变的列数(除非您通过prepare语句使用动态SQL )。



 类似资料:
  • 我有这样一份清单: 如何将此列表拆分为三个变量,每个变量分别保持不变

  • 考虑到这个辅助函数: 它应该将基本类型(和字符串)转换为字符串表达式,当我像这样使用它时,MSVC会出现编译错误: 有了clang,编译起来没有任何问题,但有了MSVC,我明白了: 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 显然,编译器会考虑

  • 问题内容: 我正在使用JMH基准测试框架(http://openjdk.java.net/projects/code- tools/jmh/ )在我的代码上运行基准测试。我的理解是,JMH在基准测试期间多次分叉JVM,以便丢弃由JVM在执行期间进行的即时(JIT)分析所建立的任何概要文件。 我了解为什么在某些情况下(例如,下面的情况(从http://java-performance.info/jm

  • 问题内容: 我正在用Socket.IO开发我的第一个Node.js应用程序,一切都很好,但是现在该应用程序正在逐渐变大,我想将应用程序代码分成不同的文件,以进行更好的维护。 例如,我在主文件中定义了所有的猫鼬模式和路由。下面是用于socket.IO连接的所有功能。但是现在我想要为架构添加一个额外的文件,为路由添加一个额外的文件,为功能添加一个额外的文件。 当然,我知道可以编写自己的模块或使用req

  • 我使用http://openjdk.java.net/projects/code-tools/jmh/的JMH基准框架对我的代码进行基准测试。我的理解是,JMH在基准测试期间多次分叉JVM,以便丢弃由JVM在执行期间执行的实时(JIT)分析建立的任何概要文件。 我理解为什么这在某些情况下是有用的,比如下面(逐字复制自http://Java-performance . info/jmh/): 默认情

  • 我试图在repl中创建一些类,当我创建具有与第一个类相同属性的第二个类时,我被告知它已经定义了。 这仅仅是repl不能正确处理名称空间的问题吗?它在文件中按预期工作。 Perl6版本:这是Rakudo版本2018.10,构建于MoarVM版本2018.10之上,实现Perl 6。c