MySQL/MariaDB:创建数据透视表视图

Posted

技术标签:

【中文标题】MySQL/MariaDB:创建数据透视表视图【英文标题】:MySQL/MariaDB: create a pivot table view 【发布时间】:2020-10-23 22:56:22 【问题描述】:

您好,有这个 MySQL (MariaDB) 表:

+----+-------+-------+---------+
| id | name  | value | user_id |
+----+-------+-------+---------+
|  1 | foo   | 40    |      10 |
|  2 | bar   | 15    |      10 |
|  3 | baz   | 390   |      10 |
|  4 | quux  | ENG   |      10 |
|  5 | waldo | 1     |      10 |
|  6 | foo   | 20    |      13 |
|  7 | bar   | 15    |      13 |
|  8 | waldo | 1     |      13 |
|  9 | baz   | 0     |      13 |
| 10 | quux  | ENG   |      13 |
| 11 | baz   | 420   |      15 |
| 12 | waldo | 1     |      15 |
| 13 | bar   | 1     |      15 |
| 14 | foo   | 5     |      15 |
| 15 | quux  | ENG   |      15 |
| 16 | waldo | 1     |      16 |
| 17 | quux  | ENG   |      16 |
| 18 | foo   | 5     |      16 |
| 19 | baz   | 0     |      16 |
| 20 | bar   | 15    |      16 |
+----+-------+-------+---------+

我需要这样的视图

+---------+-----+-----+------------+-------+
| user_id | foo | bar | baz | quux | waldo |
+---------+-----+-----+------------+-------+
|      10 | 40  |  15 | 390 | ENG  |     1 |
|      13 | 20  |  15 |   0 | ENG  |     1 |
|      15 | 5   |   1 | 420 | ENG  |     1 |
|      16 | 5   |  15 |   0 | ENG  |     1 |
+---------+-----+-----+-----+------+-------+

我阅读了以下有关 mysql 中数据透视表的文章,但我需要一些帮助来创建正确的查询:

https://riptutorial.com/mysql/example/10441/creating-a-pivot-query https://en.wikibooks.org/wiki/MySQL/Pivot_table https://codingsight.com/pivot-tables-in-mysql/ https://modern-sql.com/use-case/pivot

你能帮帮我吗?

【问题讨论】:

请发表您尝试过的内容并描述您想要的结果是什么意思(如果与问题中的不同) @P.Salmon 我添加了我阅读的文章链接,想要的结果正是我在第二个表中手动编写的。 如果您发表您尝试过的内容,所有文章似乎都很清楚,我们可以指出您出错的地方。 考虑处理应用代码中数据显示的问题 问答标签[pivot-table]中有不错的编码示例;审查他们。 【参考方案1】:

这是一个数据透视表

CREATE TABLE table1 (
  `id` INTEGER,
  `name` VARCHAR(5),
  `value` VARCHAR(3),
  `user_id` INTEGER
);

INSERT INTO table1
  (`id`, `name`, `value`, `user_id`)
VALUES
  ('1', 'foo', '40', '10'),
  ('2', 'bar', '15', '10'),
  ('3', 'baz', '390', '10'),
  ('4', 'quux', 'ENG', '10'),
  ('5', 'waldo', '1', '10'),
  ('6', 'foo', '20', '13'),
  ('7', 'bar', '15', '13'),
  ('8', 'waldo', '1', '13'),
  ('9', 'baz', '0', '13'),
  ('10', 'quux', 'ENG', '13'),
  ('11', 'baz', '420', '15'),
  ('12', 'waldo', '1', '15'),
  ('13', 'bar', '1', '15'),
  ('14', 'foo', '5', '15'),
  ('15', 'quux', 'ENG', '15'),
  ('16', 'waldo', '1', '16'),
  ('17', 'quux', 'ENG', '16'),
  ('18', 'foo', '5', '16'),
  ('19', 'baz', '0', '16'),
  ('20', 'bar', '15', '16');
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
               CONCAT('MAX(IF(s.name = "', `name`,'", `value`,"")) AS ',name)
              ) INTO @sql
FROM table1;


SET @sql = CONCAT('SELECT s.user_id,  ', @sql, ' 
                  FROM table1 s
                 GROUP BY s.user_id
                 ORDER BY s.user_id');
SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
用户 ID |酒吧 |巴兹 |富 |库克斯 |沃尔多 ------: | :-- | :-- | :-- | :--- | :---- 10 | 15 | 390 | 40 |英文 | 1 13 | 15 | 0 | 20 |英文 | 1 15 | 1 | 420 | 5 |英文 | 1 16 | 15 | 0 | 5 |英文 | 1

db小提琴here

【讨论】:

【参考方案2】:

我设法创建了正确的查询:

SELECT
  user_id,
  MAX(CASE WHEN name = "foo" THEN value END) "foo",
  MAX(CASE WHEN name = "bar" THEN value END) "bar",
  MAX(CASE WHEN name = "baz" THEN value END) "baz",
  MAX(CASE WHEN name = "quux" THEN value END) "quux",
  MAX(CASE WHEN name = "waldo" THEN value END) "waldo"
FROM table
GROUP BY user_id
ORDER BY user_id ASC

【讨论】:

以上是关于MySQL/MariaDB:创建数据透视表视图的主要内容,如果未能解决你的问题,请参考以下文章

MySQL/MariaDB视图

Excle数据透视二维数据如何创建数据透视表

Excel数据透视表(图)的切片器,快速筛选数据表格与可视化!

excel数据透视表如何生成柱状图表

如何刷新数据透视图

Excel数据透视表制作 这6个技巧超好用