簡體   English   中英

根據值將查詢結果拆分為虛擬列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM