簡體   English   中英

如何從分組行中提取值到 Oracle SQL 中的特定列?

[英]How to extract values from grouped rows to specific columns in Oracle SQL?

假設我在 Oracle 中有這樣的表:

+----------+-----------+--------+
| PersonId | ValueType | Value  |
+----------+-----------+--------+
|        1 | FirstName | John   |
|        1 | LastName  | Smith  |
|        2 | FirstName | John   |
|        2 | LastName  | Doe    |
|        2 | City      | London |
+----------+-----------+--------+

我怎樣才能 select 數據如下:

+----------+-----------+----------+--------+
| PersonId | FirstName | LastName |  City  |
+----------+-----------+----------+--------+
|        1 | John      | Smith    |        |
|        2 | John      | Doe      | London |
+----------+-----------+----------+--------+

?

嘗試使用case表達式對您的數據進行 pivot。

select
    PersonId,
    max(case when ValueType = 'FirstName' then Value end) as FirstName,
    max(case when ValueType = 'LastName' then Value end) as LastName,
    max(case when valueType = 'City' then value end) City
from yourTable
group by
    PersonId

您可以使用條件聚合 pivot 您的數據集:

select
    personid,
    max(case when valuetype = 'FirstName' then value end) firstname,
    max(case when valuetype = 'LastName'  then value end) lastname,
    max(case when valuetype = 'City'      then value end) city
from mytable
group by personid

舊的旋轉方式(重要的是,符合 SQL 標准的方式)使用條件聚合,如 zealous 和 GMB 的答案所示。

Oracle 在很久以前的 11.1 版本中引入了pivot (以及相關的unpivot )算子。 我在下面說明了這種方法。 當我們需要一次 pivot(或反透視)多個列時,這些運算符特別有用; 但是,在這個線程中情況並非如此。

設置測試表:

create table person (personid, valuetype, value) as
  select 1, 'FirstName', 'John'   from dual union all 
  select 1, 'LastName' , 'Smith'  from dual union all
  select 2, 'FirstName', 'John'   from dual union all
  select 2, 'LastName' , 'Doe'    from dual union all
  select 2, 'City'     , 'London' from dual
;

查詢和output:

select personid, firstname, lastname, city
from   person
pivot  (min(value) for valuetype in ( 'FirstName' as firstname
                                    , 'LastName'  as lastname
                                    , 'City'      as city
                                    )
       )
;

PERSONID FIRSTNAME LASTNAME  CITY  
-------- --------- --------- ------
       1 John      Smith        
       2 John      Doe       London

而且-也許更多是出於好奇(可能對其他更難的問題具有更嚴重的適用性)-這是使用match_recognize的解決方案,在 Oracle 12.1 中引入。 重要的是,與任何其他解決方案不同,這種方法不使用任何類型的聚合。

select personid, firstname, lastname, city
from   person
match_recognize
  (
    partition by personid
    measures  f.value as firstname
           ,  l.value as lastname
           ,  c.value as city
    pattern   ( (f|l|c)* )
    define    f as valuetype = 'FirstName'
         ,    l as valuetype = 'LastName'
         ,    c as valuetype = 'City'
  )
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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