根据值将查询结果拆分为虚拟列

时间:2014-10-27 16:34:28

标签: sql db2

我有一个现有的数据库,其列值被抽象到一个单独的“值”表中(出于本地化原因,但在此问题的上下文中并不一定重要)。在我的情况下,说我有两张桌子:

***ITEM Table***

id    cat  
----|-----|
1   | A   | 
2   | A   |
3   | B   |

***VALUES Table***

seq   id    code   value   type
----|----|-------|-------|-------|
10  | 1  | NAME  | Name1 | Type1 |
11  | 1  | DESC  | Desc1 | Type1 |
12  | 1  | NAME  | Name1 | Type2 |
13  | 1  | DESC  | Desc1 | Type2 |
14  | 2  | NAME  | Name2 | Type1 |
15  | 2  | DESC  | Desc2 | Type1 |

目前,我可以检索这样的名称和描述:

***Current Result Set***

id    code    value   
----|-------|-------|
1   | NAME  | Name1 |
1   | DESC  | Desc1 |
2   | NAME  | Name2 |
2   | DESC  | Desc2 |

但是,我想检索这样的名称/描述:

***Target Result Set***

id    NAME    DESC   
----|-------|-------|
1   | Name1 | Desc1 |
2   | Name2 | Desc2 |

我认为在这种情况下CTE / Window功能可能是合适的,但我不确定如何解决这个问题。

本质上,我如何根据列中的值创建列别名和关联值(在这种情况下,如果'code'列包含'NAME',则虚拟'NAME'列将是使用关联的“值”列中的值创建?

我也考虑了一个CASE语句,但是无法用它来创建像这样的动态别名。

如果这是不可能的,如(Dynamic column alias based on column value),如果我提前知道“CODE”值,那么是否可以这样做(即我知道只有“NAME”和“DESC”是有效的代码。

1 个答案:

答案 0 :(得分:1)

实际上你需要数据被转动,你可以使用CASE来实现MAX聚合功能。

如果您事先知道这些值,则可以像这样编码

如果值是动态的,那么首选动态sql。

SELECT I.ID,
       MAX ( case when code = 'NAME' THEN V.value end ) as 'NAME',
       MAX ( case when code = 'DESC' THEN V.value end ) as 'DESC'
FROM ITEM I
INNER JOIN VALUE V
ON I.id = V.id
GROUP BY I.id