sql查询将现有列条目转换为行标题

时间:2014-03-27 12:16:21

标签: sql database postgresql pivot

以上问题非常不清楚让我告诉你我的意思..

我有以下表格的表格

name ---- measure ----- value
xxx-----------m1--------------x1
xxx-----------m2--------------x2
xxx-----------m3--------------x3
yyy-----------m1--------------y1
yyy-----------m2--------------y2
yyy-----------m3--------------y3

我想将上表转换为下面的表格

name --- m1 --- m2 --- m3
xxx------x1-----x2-----x3
yyy------y1-----y2-----y3

5 个答案:

答案 0 :(得分:2)

你可以这样做来转动你的表

select name,
  MAX(case when measure = 'm1' then value end) m1,
  MAX(case when measure = 'm2' then value end) m2,
  MAX(case when measure = 'm3' then value end) m3
from tableName
group by name

SQL FIDDLE DEMO

要在未修复列值时处理旋转,您应该尝试使用crosstab函数执行此操作

答案 1 :(得分:0)

如果列m1m2m3已修复,那就是这样:

UPDATE tbl
SET m1 = t.value
FROM tbl t
WHERE tbl.name = t.name AND measure = 'm1';

同样适用于m2m3 只有这会产生重复。要删除哪个,你应该这样做:

DELETE FROM tbl WHERE measure = 'm2' OR measure = 'm3';

答案 2 :(得分:0)

尝试这个

select m11.name,m1,m2,m3 from(select name,value as m1 from tab where measure='m1')as m11,
(select name,value as m2 from tab where measure='m2' )as m12,
(select name,value as m3 from tab where measure='m3')as m13 where m11.name=m12.name and m11.name=m13.name and m12.name=m13.name;

答案 3 :(得分:0)

如果你想要这个一次性的程序,我会用简单的脚本完成这个。

  1. 插入名为

    的新表m1值

    INSERT到new_table(name,m1) 从old_table中选择名称,值,其中measure =' m1'

  2. 更新具有相同名称的m2。

    UPDATE     NEW_TABLE 组     m2 = o.value 从     new_table n     加入     old_table o ON o.name = n.name AND o.measure =' m2'

  3. 更新具有相同名称的m3。

    UPDATE     NEW_TABLE 组     m3 = o.value 从     new_table n     加入     old_table o ON o.name = n.name AND o.measure =' m3'

  4. 未经测试。请测试。

答案 4 :(得分:0)

您可以尝试使用tablefunc扩展程序中的crosstab