将列透视成行

时间:2018-11-21 15:13:24

标签: sql oracle

我有一个查询,该查询选择5列(d,p,名称,val1,val2):

SELECT
  table.bd AS d,
  g.p AS p,
  g.name || '_' || g.class || '_' || g.gname AS name,
  (CASE
    WHEN
      table.type = 'D'
    THEN
      table.b
    ELSE
      0
  END) AS VAL1,
  (CASE
    WHEN
      table.type = 'S'
    THEN
      table.b
    ELSE
      0
  END) AS VAL2

我需要将我的行分成2个单独的行。两行都将具有前3列,但其中一列将仅包含val1列,另一行将包含val2列。

例如,如果我的查询返回一行:

  d    p    name    val1    val2
'val' 25   'john'   450     90

我需要:

  d    p    name    val1
'val' 25   'john'   450

  d    p    name    val2
'val' 25   'john'   90

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

集合运算符(UNION / UNION ALL)应该可以解决问题。无法完整查看数据的结构,但可以使用以下内容:

SELECT d, p, name, val1 FROM table UNION ALL select d, p , name, val2 FROM table;

如果在val1 = val2的情况下不需要重复的结果,请使用UNION而不是UNION ALL。

SELECT d, p, name, val1 FROM table UNION select d, p , name, val2 FROM table;

但是,由于它将是val1和val2的单列,因此它的名称将为val1,因为它来自第一个select语句,因此结果将为:

  d    p    name    val1
'val' 25   'john'   450
'val' 25   'john'   90