简体   繁体   中英

Create new row based on column value SQL Server

I have data like this

DECLARE @Employee TABLE 
   (EmployeeName NVARCHAR(50),
    EmployeeAddress NVARCHAR(50),
    WorkedLocations NVARCHAR(50), 
    IdNumbers NVARCHAR(50),
    UpdatedOn Date
)

Insert into @Employee
Values ('Alex',' Alex address','Cisco','12345',GETDATE()),
       ('John','John Address','Microsoft','23456',GETDATE()),
       ('Bob','Bob Address','CiscoMicrosoft','78903,89067',GETDATE()),
       ('Bill','Bill Address','Microsoft','54652',GETDATE())

 select * from @Employee

In 3rd row based on the 3rd column value a row has to be created and 4th row value should be split and assigned to respective 3rd column. Please see below required output

DECLARE @Employee TABLE (
EmployeeName NVARCHAR(50)
, EmployeeAddress NVARCHAR(50)
, WorkedLocations NVARCHAR(50)
, IdNumbers NVARCHAR(50)
,UpdatedOn Date)

Insert into @Employee
Values ('Alex',' Alex address','Cisco','12345',GETDATE()),
       ('John','John Address','Microsoft','23456',GETDATE()),
       ('Bob','Bob Address','Cisco','78903',GETDATE()),
       ('Bob','Bob Address','Microsoft','89067',GETDATE()),
       ('Bill','Bill Address','Microsoft','54652',GETDATE())

 select * from @Employee

Thanks in advance!

This will at least split your Multi-ID-column and deliver an output close to the needed. For splitting the company's names you must give more information.

EDIT: As you statet, there is only Cisco, Microsoft and CiscoMicrosoft. So - in this special case, this should work:

    DECLARE @Employee TABLE 
   (EmployeeName NVARCHAR(50),
    EmployeeAddress NVARCHAR(50),
    WorkedLocations NVARCHAR(50), 
    IdNumbers NVARCHAR(50),
    UpdatedOn Date
)

Insert into @Employee
Values ('Alex',' Alex address','Cisco','12345',GETDATE()),
       ('John','John Address','Microsoft','23456',GETDATE()),
       ('Bob','Bob Address','CiscoMicrosoft','78903,89067',GETDATE()),
       ('Bill','Bill Address','Microsoft','54652',GETDATE());

SELECT *
      ,CASE WHEN IsMulti=0 THEN WorkedLocations ELSE CASE WHEN inx = 1 THEN 'Cisco' ELSE 'Microsoft' END END AS WorkedLocationResolved

FROM
(
    SELECT ROW_NUMBER() OVER(PARTITION BY EmployeeAddress ORDER BY UpdatedOn) AS inx,*
    FROM
    (
        SELECT EmployeeName
              ,EmployeeAddress
              ,WorkedLocations
              ,x.y.value('.','int') AS IdNumber
              ,UpdatedOn
              ,CASE WHEN CHARINDEX(',',IdNumbers,1)>0 THEN 1 ELSE 0 END AS IsMulti 
        FROM @Employee AS empl
        CROSS APPLY(SELECT CASE WHEN WorkedLocations='CiscoMicrosoft' THEN 'Cisco,Microsoft' ELSE WorkedLocations END) AS wl(wl)
        CROSS APPLY
        (
            SELECT CAST('<root><r>' + REPLACE(IdNumbers,',','</r><r>') + '</r></root>'  AS XML)
        ) AS IDs(v)
        CROSS APPLY IDs.v.nodes('/root/r') AS x(y)
    ) AS tbl
) AS tbl2

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM