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

MySQL中的数据透视表-使用varchar格式的值转换为数据透视表

吉岳
2023-03-14
问题内容

我想从Table1转换数据,如您在数据透视表中的第一张图片上所见。在MySQL中可以做到吗?因为数据透视表(A,B,C,D)的值是varchar数据格式,所以我不能使用MySQL的任何聚合函数(例如SUM或其他函数)。

Table1:
PK        Name     Subject     Grade
-------------------------------------
1         Bob       Math        A
2         Bob       History     B
3         Bob       Language    C
4         Bob       Biology     D
5         Sue       History     C
6         Sue       Math        A
7         Sue       Music       A
8         Sue       Geography   C


Pivot_table:
Subject     Bob     Sue
-------------------------
Math        A        A
History     B        C
Language    C 
Biology     D
Music                A
Geography            C

谢谢你的帮助


问题答案:

静态查询(就Bob和Sue而言)可能看起来像这样

SELECT subject, 
       MAX(CASE WHEN name = 'Bob' THEN grade END) `Bob`,
       MAX(CASE WHEN name = 'Sue' THEN grade END) `Sue` 
  FROM table1 
 GROUP BY subject

现在可以使用动态SQL来解释其他名称

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT
         CONCAT('MAX(CASE WHEN name = ''', name,
                ''' THEN grade END) `', name, '`'))
  INTO @sql
  FROM table1;

SET @sql = CONCAT('SELECT subject, ', @sql, ' 
                     FROM table1 
                    GROUP BY subject');

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

输出:

| 主题| BOB | 苏|
| ----------- || -------- | -------- |
| 生物学| D | (空)|
| 地理| (空)| C |
| 历史| B | C |
| 语言| C | (空)|
| 数学| A | A |
| 音乐| (空)| A |

这是 SQLFiddle 演示

您可以将其包装到存储过程中,以简化调用端的操作

DELIMITER $$
CREATE PROCEDURE sp_grade_report()
BEGIN
  SET @sql = NULL;

  SELECT GROUP_CONCAT(DISTINCT
           CONCAT('MAX(CASE WHEN name = ''', name,
                  ''' THEN grade END) `', name, '`'))
    INTO @sql
    FROM table1;

  SET @sql = CONCAT('SELECT subject, ', @sql, ' 
                       FROM table1 
                      GROUP BY subject');

  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

用法示例:

CALL sp_grade_report();

这是 SQLFiddle 演示



 类似资料:
  • 问题内容: 我有两个表三元组和标签 三元组表具有以下列 标签表具有以下列 我正在尝试编写sql创建带有动态标题的数据透视表 输出应该是这样的 编写SQL的任何帮助将不胜感激。我在网上看到了示例,但无法弄清楚这一示例 问题答案: 为了 转动 在MySQL中的数据,您需要同时使用聚合函数和表达。 如果您知道已知的列数,则可以对查询进行硬编码: 参见带有演示的SQL Fiddle 但是,如果您的列数未知

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

  • A 数据透视表介绍 B.1 什么是数据透视表? 数据透视表是一种可以快速汇总、分析大量数据表格的交互式工具。使用数据透视表可以按照数据表格的不同字段从多个角度进行透视,并建立交叉表格,用以查看数据表格不同层面的汇总信息、分析结果以及摘要数据。使用数据透视表可以深入分析数值数据,以帮助用户发现关键数据,并做出有关企业中关键数据的决策。 数据透视表是针对以下用途特别设计的:以友好的方式,查看大量的数据

  • 数据透视表显示二维交集的度量值,并在表格视图中表示数据。 图表属性 选择图表类型后,可以更改其属性来自定义图表: 选项 描述 常规 背景颜色 设置图表区域的背景颜色。 不透明度 设置背景颜色的不透明度。 显示边框 显示图表外部边框。 边界颜色 设置图表外部边框的颜色。 显示标题 显示图表的主要标题。 标题 指定图表的标题。 标题字体 设置标题的字体样式。 位置 设置标题的位置。 对齐 设置标题的水

  • 数据透视表显示二维交集的度量值,并在表格视图中表示数据。 图表属性 选择图表类型后,可以更改其属性来自定义图表: 选项 描述 常规 背景颜色 设置图表区域的背景颜色。 显示边框 显示图表外部边框。 边界颜色 设置图表外部边框的颜色。 显示标题 显示图表的主要标题。 标题 指定图表的标题。 标题字体 设置标题的字体样式。 位置 设置标题的位置。 对齐 设置标题的水平对齐方式。 数据 字体 设置字段名

  • 数据透视表显示二维交集的度量值,并在表格视图中表示数据。 图表属性 选择图表类型后,可以更改其属性来自定义图表: 选项 描述 常规 背景颜色 设置图表区域的背景颜色。 不透明度 设置背景颜色的不透明度。 显示边框 显示图表外部边框。 边界颜色 设置图表外部边框的颜色。 显示标题 显示图表的主要标题。 标题 指定图表的标题。 标题字体 设置标题的字体样式。 位置 设置标题的位置。 对齐 设置标题的水