mysql - SQL 列表项不重复第一个

标签 mysql sql oracle

我有一个包含作业名称的表 例如:

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 BYLISTAGG

关于mysql - SQL 列表项不重复第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36988016/

相关文章:

mysql - 为了拥有主键,我应该添加一个 autoinc 主键吗?

mysql - 多次更新查询mysql

Oracle PL/SQL : Forwarding whole row to procedure from a trigger

Python 游标返回行数而不是行数

mysql - 如何在 DOS 提示符下使用 Sql

mysql - 在同一个表中显示子和父关系(如果有)

sql - 带替换变量的 Ora-01008

mysql - 对于包含超过 1 件商品的订单,最多只能选择 2 行

sql - 如何在 Oracle SQL 中连接多个临时表(使用 with 子句)

sql - DEFAULT 约束在 SQL Oracle 中不起作用?