[英]How to extract multiple rows from a table based on values from multiple columns from another table and then concatenate in 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.