2014-10-27 60 views
0

我有一個現有的數據庫,其列值已被抽象到單獨的「值」表(出於本地化的原因,但在此問題的上下文中不一定重要)。在我的情況,說我有兩個表:根據值將查詢結果拆分爲虛擬列

***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 /窗口函數可能適合在這種情況下,但我不知道如何解決這個問題。

實質上,如何基於列中的值創建列別名和關聯值(在這種情況下,如果'code'列包含'NAME',則會創建虛擬'NAME'列,來自相關「值」列的值)?

我也考慮過CASE語句,但不能用它來創建這樣的動態別名。

如果這是不可能的,就像在(Dynamic column alias based on column value)中一樣,如果我提前知道「CODE」值,就可以做到這一點(即我知道只有「NAME」和「DESC」是有效代碼。

回答

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 
+0

真的很接近,但我忘了提及可能有多個'NAME'或'DESC'與給定項目相關聯,所以MAX不一定像這裏提到的那樣工作。還有一列將這些值進一步分類(「類型」)。 – sparty02 2014-10-27 21:55:39

+0

我想我可以在我的謂詞中包含這個TYPE,或者在我的CASE – sparty02 2014-10-27 22:03:51

+0

@ spary02中包含附加條件,您可以鍵入group by,也可以選擇從句 – radar 2014-10-27 22:26:27

相關問題