[英]Oracle Using ListAgg, distinct values, across multiple columns
對於Oracle 12c ...我有一張出售給某公司的行項目表。 該表具有銷售給該公司的代表的3層級別層次結構。 列之一是公司名稱。 我需要編寫SQL的幫助,才能生成逗號分隔的唯一名稱列表,該列表包含所有三列,出售給該公司的所有行中所有人員的姓名。 舉個例子...
CompanyName Rep Manager GVP
----------- ------- -------- --------
Sears Bob Tim Frank
Sears Jack Tim Frank
Ace Scott Chris Bill
當我查看Sears時,SQL應該返回“ Bob,Jack,Tim,Frank”。 名稱的ORDER無關緊要,只是它們是唯一的,並且它們包括來自所有3個字段的名稱。 我認為這是ListAgg查詢的一種,但可能是錯誤的...
使用UNPIVOT
符(它將僅執行單個表掃描,而使用UNION
通常將對聯合語句中的每個SELECT
執行一個表掃描):
Oracle安裝程序 :
CREATE TABLE table_name ( CompanyName, Rep, Manager, GVP ) AS
SELECT 'Sears', 'Bob', 'Tim', 'Frank' FROM DUAL UNION ALL
SELECT 'Sears', 'Jack', 'Tim', 'Frank' FROM DUAL UNION ALL
SELECT 'Ace', 'Scott', 'Chris', 'Bill' FROM DUAL;
查詢 :
SELECT CompanyName,
LISTAGG( Name, ',' ) WITHIN GROUP ( ORDER BY Name ) AS Names
FROM (
SELECT DISTINCT
CompanyName,
Name
FROM table_name
UNPIVOT( name FOR typ IN ( Rep, Manager, GVP ) )
)
GROUP BY CompanyName;
輸出 :
COMPANYNAME NAMES
----------- ------------------
Ace Bill,Chris,Scott
Sears Bob,Frank,Jack,Tim
您需要取消數據透視表(刪除重復項),然后重新匯總:
select companyname, listagg(person, ',') within group (order by person) as persons
from ((select companyname, repfrom as person t) union
(select companyname, manager from t) union
(select companyname, gvp from t)
) t
group by companyname;
此SQL應該可以解決問題:
select listagg(p, ', ') within group (order by p) from (
select rep p
from your_table
union
select manager p
from your_table
union
select gvp p
from your_table);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.