我有一个现有的数据库,其列值被抽象到一个单独的“值”表中(出于本地化原因,但在此问题的上下文中并不一定重要)。在我的情况下,说我有两张桌子:
***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”是有效的代码。
答案 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