我有一个包含作业名称的表 例如:
contact_task# ContactName
984 Michael
984 Andrew
984 Steve
984 Paul
我想根据上面的内容创建一个查询,以便得到这样的结果
Contact_task# ContactName OtherContact
984 Michael Andrew, Steve, Paul
984 Andrew Michael, Steve, Paul
984 Steve Michael, Andrew, Paul
984 PAul Michael, Andrew, Steve
我已经启动了它,但我无法让 contactName 不再出现在其他联系人上
select a.Contact_task, a.ContactName, OtherContact
from contacttable a
LEFT OUTER JOIN (SELECT xx.Contact_task,
rtrim(MAX(decode(rn,
1,
xx.ContactName)) || ', ' ||
MAX(decode(rn,
2,
xx.ContactName)) || ', ' ||
MAX(decode(rn,
3,
xx.ContactName)) || ', ' ||
MAX(decode(rn,
4,
xx.ContactName)) || ', ' ||
MAX(decode(rn,
5,
xx.ContactName)) || ', ' ||
MAX(decode(rn,
6,
xx.ContactName)),
', ') AS OtherContact
FROM (SELECT a.Contact_task,
ContactName,
row_number() over(PARTITION BY a.Contact_task ORDER BY ContactName ) rn
FROM contacttable a
) xx
GROUP BY xx.Contact_task) y ON a.Contact_task =
y.Contact_task
where a.Contact_task = '984'
最佳答案
这是一种方法 -
WITH data
AS (SELECT 984 id, 'M' name FROM DUAL
UNION ALL
SELECT 984 id, 'A' name FROM DUAL
UNION ALL
SELECT 984 id, 'S' name FROM DUAL
UNION ALL
SELECT 984 id, 'P' name FROM DUAL)
SELECT d1.id,
d1.name,
LISTAGG (d2.name, ',') WITHIN GROUP (ORDER BY d2.name) other
FROM data d1
JOIN data d2 ON d1.id = d2.id AND d1.name <> d2.name
GROUP BY d1.id, d1.name;
基本上,我已将表连接到自身,条件是 ID 相同但名称不同。这样,在您的示例中,ID:984, Name:Michael
将根据相同 ID 和不同名称(Andrew、Steve 和 Paul
)连接到 3 行。
那么您需要做的就是在其他名称上使用 GROUP BY
和 LISTAGG
。
关于mysql - SQL 列表项不重复第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36988016/