我尝试搜索帖子,但只找到了 SQL Server/Access 的解决方案。我需要 MySQL (5.X) 中的解决方案。
我有一个包含 3 列的表(称为历史记录):hostid、itemname、itemvalue。
如果我执行选择(select * from History),它将返回
+--------+----------+-----------+ | hostid | itemname | itemvalue | +--------+----------+-----------+ | 1 | A | 10 | +--------+----------+-----------+ | 1 | B | 3 | +--------+----------+-----------+ | 2 | A | 9 | +--------+----------+-----------+ | 2 | C | 40 | +--------+----------+-----------+
如何查询数据库以返回类似内容
+--------+------+-----+-----+ | hostid | A | B | C | +--------+------+-----+-----+ | 1 | 10 | 3 | 0 | +--------+------+-----+-----+ | 2 | 9 | 0 | 40 | +--------+------+-----+-----+
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
我将添加一个更长、更详细的说明来说明解决此问题的步骤。如果太长,我深表歉意。
我将从您给出的基础开始,并用它来定义几个术语,我将在本文的其余部分使用这些术语。这将是基表:
这将是我们的目标,漂亮的数据透视表:
history.hostid列中的值将成为数据透视表中的y 值。history.itemname列中的值将变为 x-values(出于显而易见的原因)。当我必须解决创建数据透视表的问题时,我使用三步过程来解决它(带有可选的第四步):
让我们将这些步骤应用于您的问题,看看会得到什么:
第 1 步:选择感兴趣的列。在所需的结果中,
hostid提供y 值,itemname提供x 值。第 2 步:使用额外列扩展基表。我们通常需要每个 x 值一列。回想一下,我们的 x 值列是
itemname:create view history_extended as ( select history.*, case when itemname = "A" then itemvalue end as A, case when itemname = "B" then itemvalue end as B, case when itemname = "C" then itemvalue end as C from history ); select * from history_extended; +--------+----------+-----------+------+------+------+ | hostid | itemname | itemvalue | A | B | C | +--------+----------+-----------+------+------+------+ | 1 | A | 10 | 10 | NULL | NULL | | 1 | B | 3 | NULL | 3 | NULL | | 2 | A | 9 | 9 | NULL | NULL | | 2 | C | 40 | NULL | NULL | 40 | +--------+----------+-----------+------+------+------+请注意,我们没有更改行数 - 我们只是添加了额外的列。另请注意
NULL的模式 -itemname = "A"的行的新列A具有非空值,并且其他新列的空值。第 3 步:对扩展表进行分组和聚合。我们需要
按 hostid 分组,因为它提供了 y 值:create view history_itemvalue_pivot as ( select hostid, sum(A) as A, sum(B) as B, sum(C) as C from history_extended group by hostid ); select * from history_itemvalue_pivot; +--------+------+------+------+ | hostid | A | B | C | +--------+------+------+------+ | 1 | 10 | 3 | NULL | | 2 | 9 | NULL | 40 | +--------+------+------+------+(请注意,我们现在每个 y 值一行。) 好的,我们就快到了!我们只需要摆脱那些丑陋的
NULL即可。第四步:美化。我们将用零替换任何空值,以便结果集看起来更好:
create view history_itemvalue_pivot_pretty as ( select hostid, coalesce(A, 0) as A, coalesce(B, 0) as B, coalesce(C, 0) as C from history_itemvalue_pivot ); select * from history_itemvalue_pivot_pretty; +--------+------+------+------+ | hostid | A | B | C | +--------+------+------+------+ | 1 | 10 | 3 | 0 | | 2 | 9 | 0 | 40 | +--------+------+------+------+我们就完成了——我们已经使用 MySQL 构建了一个漂亮的数据透视表。
应用此过程时的注意事项:
itemvalueNULL,但也可能是0或"",具体取决于您的具体情况sum,但是count和max也经常使用(max经常在构建单行时使用)分布在多行中的“对象”)group by子句(并且不要忘记select他们)已知限制: