我有一個只有 2 列的表,第一列是名稱識別符號,第二列是該識別符號的值(基本上該表充當默認值),下面是該表的螢屏截圖。

我想要的是將表從多行轉換為單行,值將是第一列作為列名的列。例如,將當前值轉換為下面的值。

我讀過 PIVOT 運算子,但是它需要在 pivot 子句中使用聚合函式,但我認為在這種情況下我不能使用聚合函式,它只是將行值設定為列值。PIVOT 是否可以實作這一點,或者我應該使用其他結構來實作這一點嗎?
uj5u.com熱心網友回復:
已經有一個正確的技術答案,展示了如何根據您的情況進行調整。
讓我從邏輯層面解釋為什么這種“旋轉”確實是一種聚合。
您有一組四行,您想為該組生成一個“匯總行”。(想象一下,平行地,你有幾個員工由員工 ID 標識,在一個附加列中;每個員工最多有四行,對于相同的屬性。然后你按員工 ID 分組,每個組最多有四行 -如果缺少屬性,則更少 - 并且您希望為每個組獲得一個“匯總行”。)
這是一種聚合形式。但是對于什么聚合函式?你似乎只有一個值AGE,只有一個值STATUS,等等。
事實上,你可以認為AGE存在于四行中的每一行。當CODE是時'AGE'則值為42,當CODE是其他時則值為NULL。您可以在這四個值上使用SUM(), AVG(), MIN(), MAX()(一個是42,其余是NULL);它們都會回傳相同的答案,42因為所有聚合函式都忽略NULL.
如果值是字串而不是數字怎么辦?答案:同樣的事情 - 除了你不能使用SUM()or AVG()。你還有MIN()和MAX()。事實上,您也可以使用其他聚合函式 - 它們只需要是字串聚合。例如,您可以使用LISTAGG(). 同樣,您正在聚合一個非NULL字串,其他的是NULL,因此結果將只是一個非NULL字串。
在 Oracle PIVOT11.1 版資料庫中引入運算子之前,程式員已經能夠進行資料透視 - 就像我解釋的那樣使用條件聚合。就像是
select max(case when code = 'AGE' then AGE end) as AGE,
...
from ...
group by EMPLOYEE_ID -- in the more general case
(在您的簡單情況下,您不需要按任何內容分組。)
uj5u.com熱心網友回復:
您可以為此目的使用 pivot 子句,如下所示(您的表只有 2 列,我假設您沒有任何重復的代碼)
select *
from Yourtable
pivot (
max(value) for code in (
'AGE' as AGE
, 'FIRST_NAME' as FIRST_NAME
, 'LAST_NAME' as LAST_NAME
, 'STATUS' as STATUS
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388840.html
上一篇:在OracleSQL中使用日期
下一篇:TO_CHAR在SQL查詢中失敗
