对于甲骨文12c..。我有一张卖给一家公司的系列商品表。这个表有一个3层层次的代表谁卖给这个公司。其中一列是公司名称。我需要帮助编写SQL以生成一个逗号分隔的、唯一的人名列表,包括所有三列,以及销售给该公司的所有行。举个例子。
CompanyName Rep Manager GVP
----------- ------- -------- --------
Sears Bob Tim Frank
Sears Jack Tim Frank
Ace Scott Chris Bill当我看西尔斯时,SQL应该返回'Bob,Jack,Tim,Frank‘。名称的顺序并不重要,只是它们是唯一的,并且包括来自所有三个字段的名称。我假设这是一种ListAgg查询,但可能是错误的.
发布于 2016-07-01 16:12:31
使用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发布于 2016-07-01 16:02:14
您需要取消数据的枢轴(以删除重复数据),然后重新聚合数据:
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;发布于 2016-07-01 16:06:17
这个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);https://stackoverflow.com/questions/38149592
复制相似问题