【问题标题】:Create new columns for duplicate row values based on column ID duplicate in sql根据sql中重复的列ID为重复的行值创建新列
【发布时间】:2020-01-19 20:25:09
【问题描述】:

我有一个包含 2 列的表,第一列称为 ID,第二列称为 TRACKINGID 列有重复项,我想将所有这些重复项合并到一行中,其中来自重复行的 TRACKING 中的每个值都放入同一行中的新列中,我不再有重复项.

我尝试了一些建议的方法,将所有值连接到一列中,但我希望重复的 IDs 的这些 TRACKING 值位于单独的列中。下面的代码没有达到我的预期。

SELECT ID, TRACKING = 
    STUFF((SELECT DISTINCT ', ' + TRACKING
       FROM #t b 
       WHERE b.ID = a.ID 
      FOR XML PATH('')), 1, 2, '')
FROM #t a
GROUP BY ID

我正在寻找这个:

| ID | TRACKING |
-----------------
| 5  | 13t3in3i |
| 5  | g13g13gg |
| 3  | egqegqgq |
| 2  | 14y2y24y |
| 2  | 42yy44yy |
| 5  | 8i535i35 |

然后把它变成这样:

| ID |  TRACKING  | TRACKING1 | TRACKING2 |
-----------------
| 5  |  13t3in3i  | g13g13gg  | 8i535i35  |
| 3  |  egqegqgq  |           |           |
| 2  |  14y2y24y  | 42yy44yy  |           |

【问题讨论】:

  • 你使用什么数据库?
  • @mdem7 我正在尝试在 SQL 中完成此操作
  • 正确标记!!!您的代码看起来像 SQL Server,但您标记了 MySQL。它们是完全不同的产品。

标签: mysql sql database sorting mysql-5.7


【解决方案1】:

在 MySQL 中(相对)痛苦的方法是使用相关子查询:

select i.id,
       (select t.tracking
        from t
        where t.id = i.id
        order by t.tracking
        limit 1, 0
       ) as tracking_1,
       (select t.tracking
        from t
        where t.id = i.id
        order by t.tracking
        limit 1, 1
       ) as tracking_2,
       (select t.tracking
        from t
        where t.id = i.id
        order by t.tracking
        limit 1, 2
       ) as tracking_3
from (select distinct id from t
     ) i;

尽管看起来很糟糕,但它可能会在(id, tracking) 的索引上获得令人惊讶的出色表现。

顺便说一句,您使用stuff() 的原始代码会将所有内容放在一列中:

select id, group_concat(tracking)
from t
group by id;

【讨论】:

    【解决方案2】:
    with test_tbl as
    (
        select 5 id, 'goog' tracking,'goog' tracking1
        union all
        select 5 id, 'goog1','goo'
        union all
        select 2 , 'yahoo','yah'
        union all
        select 2, 'yahoo1','ya'
        union all
        select 3,'azure','azu'
    ), modified_tbl as
    (
        select id,array_agg(concat(tracking)) Tracking,array_agg(concat(tracking1)) Tracking1 from test_tbl group by 1
    )
    
    select id, tracking[safe_offset(0)]  Tracking_1,tracking1[safe_offset(0)]  Tracking_2, tracking[safe_offset(1)] Tracking_3,tracking1[safe_offset(1)] Tracking_4 from modified_tbl where array_length(Tracking) > 1
    

    【讨论】:

    • 您好,欢迎来到 stackoverflow,感谢您的回答。虽然这段代码可能会回答这个问题,但您是否可以考虑添加一些解释来说明您解决了什么问题,以及您是如何解决的?这将有助于未来的读者更好地理解您的答案并从中学习。
    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多