如何组合行?

时间:2014-07-11 09:42:45

标签: sql

我有下表:

C1 | C2 | C3
---+----+---
X1 | Y1 | Z1
X1 | Y2 | Z2
X2 | Y3 | Z3
X2 | Y4 | Z4
X3 | Y5 | Z5
X3 | Y6 | Z6

我希望合并行以获取:

C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9
---+----+----+---+-----+----+----+----+---
X1 | Y1 | Z1 | X2 | Y3 | Z3 | X3 | Y5 | Z5
X1 | Y2 | Z2 | X2 | Y4 | Z4 | X3 | Y6 | Z6

有智能和通用的方法吗? 否则,我想我要为每个Xi指定临时序列号,然后加入它们以保留顺序。

我的数据模型完全没有3列布局,但我需要将它以3×3的格式输出到另一个程序。

2 个答案:

答案 0 :(得分:1)

试试这个,你将加入同一个表三次,并且必须通过别名识别它们。

SELECT MT1.value1 AS C1,MT1.value2 AS C2,MT1.value3 AS C3,
  MT2.value1 AS C4,MT2.value2 AS C5,MT2.value3 AS C6,
  MT3.value1 AS C7,MT3.value2 AS C8,MT3.value3 AS C9 FROM MY_TABLE MT1
LEFT JOIN MY_TABLE MT2 ON (MT1.id = MT2.id AND MT2.C1='X2')
LEFT JOIN MY_TABLE MT3 ON (MT2.id = MT3.id AND MT3.C1='X3')
WHERE MT1.C1='X1'

想:

首先,您需要通过左连接添加列。你将有3 ^ 9列。

然后,添加仅在C1 / C2 / C3不同的情况下连接的条件(在X1,X2,X3中)

最后将结果减少到第一列='X1'。

答案 1 :(得分:0)

我能想到的唯一“通用”方式需要知道X和Y值:

select max(c1) as c1, max(c2) as c2, max(c3) as c3,
       max(c4) as c4, max(c5) as c5, max(c6) as c6,
       max(c7) as c7, max(c8) as c8, max(c9) as c9      
from ((select c1 as x, c2 as y, c1, c2, c3, NULL as c4, NULL as c5, NULL as c6, NULL as c7, NULL as c8, NULL as c9
       from table
       where c1 = 'x1'
      ) union all
      (select c1 as x, c2 as y, NULL, NULL, NULL, c1 as c4, c2 as c5, c3 as c6, NULL as c7, NULL as c8, NULL as c9
       from table
       where c1 = 'x2'
      ) union all
      (select c1 as x, c2 as y, NULL, NULL, NULL, NULL as c4, NULL as c5, NULL as c6, c1 as c7, c2 as c8, c3 as c9
       from table
       where c1 = 'x3'
      )
     ) t
group by x, y;

在任何特定的数据库中,可能存在更通用的解决方案,其中(例如)您不必保证col2中的值不同。但是,此解决方案应该适用于问题中提到的数据,并且在标准SQL的意义上它是通用的。