将多个列组合成一个长列

时间:2016-06-10 13:14:48

标签: php sql database db2

我看了看板子并搜索了一堆,但我找不到适合我的场景。我有4列

+--------+------+------+
| empnum | appn | rate |
+--------+------+------+
|   13   | 1111 |12.34 |
+--------+------+------+
|   13   | 2222 |14.44 |
+--------+------+------+
|   13   | 3333 |15.62 |
+--------+------+------+
|   13   | 4444 |16.12 |
+--------+------+------+

每列具有相同的员工编号但信息不同。我试图将这4列合并为1.我唯一能找到的就是连接。但这对我不起作用,因为这些需要进入一个数组,所以我可以在数据表中构建它。我希望它看起来像这样。

+------+-----+-----+-----+-----+-----+-----+-----+-----+
|empnum|appn1|rate1|appn2|rate2|appn3|rate3|appn4|rate4|
+------+-----+-----+-----+-----+-----+-----+-----+-----+
|  13  |1111 |12.34|2222 |14.44|3333 |15.62|4444 |16.12|
+------+-----+-----+-----+-----+-----+-----+-----+-----+

截至一周前,所有这些信息都来自平面文件。一位同事创建了一个关系表,就在我大脑爆炸的时候。我们正在研究Db2,我尝试在php中使用foreach循环遍历数组并查找empnum,但我会为每个人获得相同的appn1。我想做sql我只是想不出怎么做。

2 个答案:

答案 0 :(得分:0)

您想要的是透视数据。 DB2没有PIVOT函数,但您可以使用DECODE来实现此目的。以下是another question中的一些示例。

结果集看起来像:

+------+-----+-----+-----+-----+-----+-----+
|empnum|appn1111|appn2222|appn3333|appn4444|
+------+--------+--------+--------+--------+
|  13  |12.34   |14.44   |15.62   |16.12   |
+------+--------+--------+--------+--------+

答案 1 :(得分:0)

您也可以使用LISTAGG执行此操作以获取逗号分隔列表。

像这样:

SELECT empnum, LISTAGG(TO_CHAR(appn) || ' - ' || TO_CHAR(rate), ', ') as a_list_4_u
FROM mytable

结果应如下所示

+--------+--------------------------------------------------------+
| empnum |                                                      2 |
+--------+--------------------------------------------------------+
|   13   | 1111 - 12.34, 2222 - 14.44, 3333 - 15.62, 4444 - 16.12 |
+--------+--------------------------------------------------------+