簡體   English   中英

Postgres 表選擇多列並將結果(列)動態轉換為行 - 將列轉置為行

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

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