[英]Split Query Result into Virtual Columns based on Value
我有一個現有的數據庫,該數據庫的列值被抽象到一個單獨的“值”表中(出於本地化的原因,但在此問題中不一定重要)。 就我而言,假設我有兩個表:
***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函數可能適合這種情況,但是我不確定如何解決這個問題。
本質上,如何基於列中的值創建列別名和關聯值(在這種情況下,如果“代碼”列包含“ NAME”,則將創建一個虛擬的“ NAME”列,其值來自相關的“值”列)?
我也考慮過CASE語句,但是無法使用它創建這樣的動態別名。
如果這是不可能的,例如( 基於列值的動態列別名 ),那么如果我提前知道“ CODE”值(例如,我知道只有“ NAME”和“ DESC”有效的代碼。
實際上,您需要對數據進行透視,可以將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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.