![](/img/trans.png)
[英]Postgres table transformation: transposing values of a column into new columns
[英]Postgres table selecting multiple columns and dynamically converting the result (column) into row - transposing column to rows
我有以下類型的表(損壞)結構
Rowid damageTypeACount damageTypeBCount damageTypeCCount
1 23 44 33
而且我還需要讀取這些表行,結果為(標題,id 是手動設置的),有點將列轉換為行,但具有附加屬性
id damagecountsum label
1 23 Damage Type A
2 44 Damage Type B
3 33 Damage Type C
我做了以下查詢,它有效,但想知道是否有更好的方法
SELECT 1 as id,
damageTypeACount as damagecount,
"Damage Type A Count" as label
FROM Damage where rowId=1
UNION ALL
SELECT 2 as id,
damageTypeBCount as damagecount,
"Damage Type B Count" as label
FROM Damage where rowId=1
UNION ALL
SELECT 3 as id,
damageTypeCCount as damagecount,
"Damage Type C Count" as label
FROM Damage where rowId=1
上面的查詢按預期工作,但我想知道是否可以在單個 select 語句中將列轉換為行
您可以使用橫向連接進行反透視:
select x.*
from damage d
cross join lateral (values
(d.rowId, d.damageTypeACount, 'Damage Type A'),
(d.rowId, d.damageTypeBCount, 'Damage Type B'),
(d.rowId, d.damageTypeCCount, 'Damage Type C')
) as x(id, damagecount, label)
這會將原始id
重新影響到每個生成的行。 您還可以使用row_number()
生成新的 id:
select row_number() over(order by id, label) id, x.*
from damage d
cross join lateral (values
(d.rowId, d.damageTypeACount, 'Damage Type A'),
(d.rowId, d.damageTypeBCount, 'Damage Type B'),
(d.rowId, d.damageTypeCCount, 'Damage Type C')
) as x(rowId, damagecount, label)
如果需要,您可以使用where
子句過濾結果集:
where d.rowId = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.