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');
用户 ID |酒吧 |巴兹 |富 |库克斯 |沃尔多 ------: | :-- | :-- | :-- | :--- | :---- 10 | 15 | 390 | 40 |英文 | 1 13 | 15 | 0 | 20 |英文 | 1 15 | 1 | 420 | 5 |英文 | 1 16 | 15 | 0 | 5 |英文 | 1SET @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;
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:创建数据透视表视图的主要内容,如果未能解决你的问题,请参考以下文章