Create new columns for duplicate row values based on column ID duplicate in sql

心不动则不痛 提交于 2020-04-18 05:52:10

问题


I have a table with 2 columns, the first column is called ID and the second is called TRACKING. The ID column has duplicates, I want to to take all of those duplicates and consolidate them into one row where each value from TRACKING from the duplicate row is placed into a new column within the same row and I no longer have duplicates.

I have tried a few suggested things where all of the values would be concatenated into one column but I want these TRACKING values for the duplicate IDs to be in separate columns. The code below did not do what I intended it to.

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

I am looking to take this:

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

And turn it into this:

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

回答1:


On (relatively) painful way to do this in MySQL is to use correlated subqueries:

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;

As bad as this looks, it will probably have surprisingly decent performance with an index on (id, tracking).

By the way, your original code with stuff() would put everything into one column:

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


来源:https://stackoverflow.com/questions/58000216/create-new-columns-for-duplicate-row-values-based-on-column-id-duplicate-in-sql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!