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

使用MySQL的数据透视表

东典
2023-03-14
问题内容

我有两个表三元组和标签

三元组表具有以下列

  id  PostID  TagID   Value
   1   1        1     Murder
   2   1        2     New Brunswick
   3   2        1     Theft
   4   2        3     Gun

标签表具有以下列

  id   TagName
   1   Incident
   2   Location
   3   Weapon

我正在尝试编写sql创建带有动态标题的数据透视表

输出应该是这样的

       PostID  Incident   Location         Weapon        
           1   Murder     New Brunswick    
           2   Theft                        Gun

编写SQL的任何帮助将不胜感激。我在网上看到了示例,但无法弄清楚这一示例


问题答案:

为了 转动 在MySQL中的数据,您需要同时使用聚合函数和CASE表达。

如果您知道已知的列数,则可以对查询进行硬编码:

select p.postid,
  max(case when t.tagname = 'Incident' then p.value end) Incident,
  max(case when t.tagname = 'Location' then p.value end) Location,
  max(case when t.tagname = 'Weapon' then p.value end) Weapon
from triples p
left join tags t
  on p.tagid = t.id
group by p.postid;

参见带有演示的SQL Fiddle

但是,如果您的列数未知,则需要使用一条准备好的语句来生成动态SQL:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN TagName = ''',
      TagName,
      ''' THEN p.value END) AS `',
      TagName, '`'
    )
  ) INTO @sql
FROM tags;


SET @sql 
  = CONCAT('SELECT p.postid, ', @sql, ' 
           from triples p
           left join tags t
             on p.tagid = t.id
           group by p.postid');

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

请参阅带有演示的SQL Fiddle。

两者都会给出结果:

| POSTID | INCIDENT |      LOCATION | WEAPON |
----------------------------------------------
|      1 |   Murder | New Brunswick | (null) |
|      2 |    Theft |        (null) |    Gun |


 类似资料:
  • 问题内容: 什么是在php / MySQL中处理数据透视表的最佳方法(或达到这种效果的方法) 我有一个查询,返回的信息如下 我想用PHP建立一个报表,该报表按每周开始的列标题按组进行计数。例如 但是我不确定从哪里开始,因为标题是动态的,具体取决于报表运行的月份。 我知道如何传递月份的详细信息并检索PHP中的所有数据,但是当前它只输出到一列中,而不是能够分组并放入数组中。 任何帮助表示赞赏! 问题答

  • 问题内容: 我想从Table1转换数据,如您在数据透视表中的第一张图片上所见。在MySQL中可以做到吗?因为数据透视表(A,B,C,D)的值是varchar数据格式,所以我不能使用MySQL的任何聚合函数(例如SUM或其他函数)。 谢谢你的帮助 问题答案: 静态查询(就Bob和Sue而言)可能看起来像这样 现在可以使用动态SQL来解释其他名称 输出: 这是 SQLFiddle 演示 您可以将其包装

  • 这是我从查询中得到的结果 输出 但我想

  • 问题内容: 我试图获得一个带有动态列的数据透视表。当user_id是一个字符串时,它可以正常工作,但是如果它是一个int,那么它似乎会失败 到目前为止,在过去的问题帮助下,我得到的是: 参见:http : //sqlfiddle.com/#!2/eab24/1 我确定这很简单,但是我想念什么呢? 谢谢 问题答案: 由于值在其中,因此您要将它们设为列名,因此必须将值包装在反引号中 该SQL将看起来像

  • B.1 创建数据透视表 尽管数据透视表的功能非常强大,但是创建的过程却是非常简单。 将光标点在表格数据源中任意有内容的单元格,或者将整个数据区域选中。 “插入”选项卡,单击“数据透视表”命令。 3. 在弹出的“创建数据透视表”对话框中,“请选择要分析的数据”一项已经自动选中了光标所处位置的整个连续数据区域,也可以在此对话框中重新选择想要分析的数据区域(还可以使用外部数据源,请参阅后面内容)。“选择

  • 问题内容: 我正在努力寻找解决此MySQL问题的方法。我似乎无法理解该怎么做。我有下表。 如果可能的话,我想将问题答案显示为每个结果集的列,如下所示。 任何帮助将非常感激。 谢谢 问题答案: SQLFiddle演示 如果您不清楚问题的数量( 例如Matei Mihai所说的1000个 ),则非常需要动态版本。 SQLFiddle演示 输出值