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

转置MySQL查询-需要将行分为列

柴瀚昂
2023-03-14
问题内容

一个菜鸟MYSQL用户....我有一个简单的MySQL查询,该查询返回值,并使用GROUP_CONCAT函数:

SELECT Productid, Name, GROUP_CONCAT(value)
FROM search_export 
Group By Productid, Name;

Productid   Name                     GROUP_CONCAT(value)
666056542   Brand Name           Netgear
1054677552  Ethernet Technology  Gigabit Ethernet
665655662   Form Factor          Wall Mountable,Desktop
56565765    Media Type Supported     Twisted Pair

但是,我需要转置查询,以便它以单独的列而不是行的形式返回“名称”。MySQL完全有可能吗?


问题答案:

您需要执行一项PIVOT操作,MySQL本身不支持该操作(与某些其他RDBMS不同)。

您可以获得的最接近的结果是按照以下几行构造SQL:

SELECT   ProductId,
         GROUP_CONCAT(IF(Name='Brand Name'          ,value,NULL))
           AS `Brand Name`,
         GROUP_CONCAT(IF(Name='Ethernet Technology' ,value,NULL))
           AS `Ethernet Technology`,
         GROUP_CONCAT(IF(Name='Form Factor'         ,value,NULL))
           AS `Form Factor`,
         GROUP_CONCAT(IF(Name='Media Type Supported',value,NULL))
           AS `Media Type Supported`
FROM     search_export
GROUP BY ProductId

如果可能的Name值是动态的,则可以从以下结果中以更高级的语言生成此类SQL:

SELECT DISTINCT Name FROM search_export

确实,甚至可以使用SQL本身:

SELECT CONCAT('
         SELECT   ProductId, ',
       GROUP_CONCAT('
                  GROUP_CONCAT(IF(Name=',QUOTE(Name),',value,NULL))
                    AS `',REPLACE(Name,'`','``'),'`'
       ), '
         FROM     search_export
         GROUP BY ProductId
       ')
INTO @sql
FROM (
  SELECT DISTINCT Name FROM search_export
) t;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

请注意,如果有很多不同的Name值,则可能需要增加group_concat_max_len其默认值1KiB。



 类似资料:
  • 问题内容: 我有一个简单的查询,它产生以下结果: 我想将行转置为列。 我了解mysql没有枢轴功能,因此需要工会,但不能100%确定。 先谢谢您的帮助。 问题答案: 您可以使用这样的交叉表来做到这一点- 另外,您应该将transporttype值移动到查找表中,并在该表中包含transporttype_id。

  • 问题内容: MySQL是否可以将列转换为行,从而动态添加行所需的列数。我认为我的问题可能与数据透视表有关,但是我不确定,除了给出以下示例之外,我不知道如何构造此问题。 给定两个表A和B,它们看起来像 表A 我想编写一个如下查询: 结果表 基本上,我想将表B中的每一行变成结果表中的一列。如果有一个新条目被添加到表B中,id = 1,那么我希望结果表自动扩展一列以容纳这个额外的数据点。 问题答案: 您

  • 我想将原始SQL查询“转换”为Eloquent,这样我也可以附加渴望加载的模型,这样我就不必编辑我得到的一些模板。问题是,查询得到了一些子查询,我不知道如何将查询“转换”为Eloquent的格式。问题是: 我已经尝试了一些方法,但没有一种有效。我有点被困在如何“思考”这件事上了。来自Laravel本身的文档也没有多大帮助。 简而言之:我有两个模型,一个是剧集,另一个是episode_histori

  • 我使用了cakephp Mysql到mongodb查询组件,即将Mysql查询转换到mongodb中,但是当查询有多个括号时代码停止工作,我还尝试将http://www.querymongo.com/site上的查询转换为相同的问题,

  • 问题内容: 我正在处理数据透视表查询。架构如下 Sno,名称,地区 同一名称可能在许多地区出现,例如以样本数据为例 如您所见,我有一组4个不同的地区(CA,JB,MN,LP)。现在,我想通过将名称映射到区域来获取为其生成的数据透视表 我为此写了以下查询 但是,地区可能会增加,在这种情况下,我将不得不再次手动编辑查询并向其中添加新的地区。 我想知道是否存在一个查询,该查询可以动态获取不同地区的名称并

  • 问题内容: 如果已经提出并回答了这个问题,请原谅我,我已经搜索并找到了一些看起来相似的东西,但是我对SQL的新手知识太多,无法适应他们的需求。如果我不使用正确的术语,也请原谅我,我知道当有人问一个问题并且他们甚至不知道能够问他们需要什么时,这可能会很烦人。 < 第二次编辑3月22日:> 好的,我不了解源数据的实际外观,这就是为什么我无法获得想要的东西。感谢@goran推动我将真实的源表发布到此处(