MySQL列值数据透视

时间:2010-04-19 23:48:47

标签: sql mysql

我有一个MySQL InnoDB表,如下所示: id(int),run_id(int),element_name(varchar),value(text),line_order,column_order

`MyDB`.`MyTable` (
  `id` bigint(20) NOT NULL,
  `run_id` int(11) NOT NULL,
  `element_name` varchar(255) NOT NULL,
  `value` text,
  `line_order` int(11) default NULL,
  `column_order` int(11) default NULL

它用于存储由用于以CSV格式输出的Java程序生成的数据,因此存储line_order和column_order。 假设我有4个条目(根据表格描述):

1,1,'ELEMENT 1','A',0,0
2,1,'ELEMENT 2','B',0,1
3,1,'ELEMENT 1','C',1,0
4,1,'ELEMENT 2','D',1,1

我想在视图中透过这些数据进行报告,这样看起来就像CSV一样,输出看起来像这样:

---------------------
|ELEMENT 1|ELEMENT 2| <--- Element Name
---------------------
|   A     |   B     | <--- Value From line_order = 0
---------------------
|   C     |   D     | <--- Value From line_order = 1
---------------------

进入的数据非常动态;它可以是任何顺序,可以是900多种不同元素中的任何一种,价值可以是任何东西。运行ID将它们联系在一起,行和列顺序基本上让我知道用户希望数据按顺序返回的位置。我希望它在显示的矩阵中按行和列顺序排序/分组。

1 个答案:

答案 0 :(得分:1)

你可以通过自我加入来做到这一点:

select e1.element_name, e1.value, e2.value
from MyTable e1
inner join MyTable e2
on e1.element_name = e2.element_name
and e2.line_order = 1
where e1.line_order = 0

from选择line_order = 1,内部联接选择line_order = 2

如果您想返回只有一个line_order的元素,请将inner join切换为cross join

在回复您的评论时,您可以写出固定数量的元素,例如:

select
    line_order
,   max(case when element_name = 'element 1' then value end) as Element1Value
,   max(case when element_name = 'element 2' then value end) as Element2Value
,   max(case when element_name = 'element 3' then value end) as Element3Value
,   ...
from MyTable
group by line_order

max()结构假定(element_name, line_order)是唯一的。