簡體   English   中英

Oracle在多個列中使用ListAgg,不同的值

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

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