我试图搜索帖子,但我只找到了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 |
+--------+------+-----+-----+
10 回答
我的解决方案
它在提交的案例中产生预期结果 .
利用Matt Fenwick帮助我解决问题的想法(非常感谢),让我们将其简化为一个查询:
另一个选项,如果你有很多需要转动的项目,特别有用的是让mysql为你构建查询:
FIDDLE添加了一些额外的值以使其正常工作
GROUP_CONCAT
的默认值为1000,因此如果您有一个非常大的查询,请在运行之前更改此参数测试:
我把它变成了
Group By hostId
然后它只会显示第一行的值,喜欢:
这不是您正在寻找的确切答案,但它是我在项目中需要的解决方案,并希望这有助于某人 . 这将列出以逗号分隔的1到n行项目 . Group_Concat使这在MySQL中成为可能 .
这个墓地有两个通用名称,所以名称列在不同的行中,这些行由一个id但两个名称id连接,查询产生这样的东西
CemeteryID Cemetery_Name纬度
1 Appleton,Sulpher Springs 35.4276242832293
我将为解决此问题的步骤添加一些更长更详细的解释 . 如果太长,我道歉 .
我已经给出并使用它来定义一些我将用于本文其余部分的术语 . 这将是 base table :
这将是我们的目标 pretty pivot table :
history.hostid
列中的值将在数据透视表中变为 y-values .history.itemname
列中的值将变为 x-values (出于显而易见的原因) .当我必须解决创建数据透视表的问题时,我使用三步过程(可选的第四步)来解决它:
选择感兴趣的列,即 y-values 和 x-values
用额外的列扩展基表 - 每个列 x-value
分组并聚合扩展表 - 每个 y-value 一组
(可选)美化聚合表
让我们将这些步骤应用到您的问题中,看看我们得到了什么:
Step 1: select columns of interest . 在期望的结果中,
hostid
提供 y-values ,itemname
提供 x-values .Step 2: extend the base table with extra columns . 我们通常每x值需要一列 . 回想一下,我们的x值列是
itemname
:请注意,我们没有更改行数 - 我们只添加了额外的列 . 另请注意
NULL
的模式 - 带有itemname = "A"
的行对于新列A
具有非空值,而对于其他新列具有空值 .Step 3: group and aggregate the extended table . 我们需要
group by hostid
,因为它提供了y值:(注意,我们现在每y值有一行 . )好的,我们差不多了!我们只需要摆脱那些丑陋的
NULL
.Step 4: prettify . 我们只是用零替换任何空值,因此结果集更好看:
我们已经完成了 - 我们使用MySQL构建了一个漂亮,漂亮的数据透视表 .
应用此过程时的注意事项:
在额外列中使用什么值 . 我在这个例子中使用了
itemvalue
在额外列中使用的"neutral"值 . 我使用
NULL
,但也可能是0
或""
,具体取决于您的具体情况分组时要使用的聚合函数 . 我使用了
sum
,但是经常使用count
和max
(max
经常用于构建遍布多行的一行"objects")使用多个列作为y值 . 此解决方案不仅限于使用单个列作为y值 - 只需将额外的列插入
group by
子句(并且不要忘记select
它们)已知限制:
我编辑Agung Sagita 's answer from subquery to join. I'我不确定这两种方式有多大区别,但仅供另一个参考 .
我找到了一种方法,使用简单的查询使我的报表将行转换为几乎动态的列 . 你可以看到并测试它online here .
columns of query is fixed 的数量,但 values are dynamic 并基于行的值 . 你可以构建它所以,我使用一个查询来构建表头,另一个查询值:
你也可以总结一下:
结果RexTester:
http://rextester.com/ZSWKS28923
对于一个真实的使用示例,此报告在下面的列中显示了带有视觉时间表的船/公共汽车的离港时间 . 你会看到一个额外的在最后一个col没有使用的列而不会混淆可视化:
**票务系统在线和预售的售票
使用子查询
但是如果子查询产生多于一行,则在子查询中使用更多聚合函数将是一个问题