【问题标题】:MySQL/MariaDB: create a pivot table viewMySQL/MariaDB:创建数据透视表视图
【发布时间】: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 中数据透视表的文章,但我需要一些帮助来创建正确的查询:

你能帮帮我吗?

【问题讨论】:

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

标签: mysql mariadb 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
    

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2018-03-29
      • 1970-01-01
      相关资源
      最近更新 更多