Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server show column as delimited against a repeatable key

Please help me write a SQL query. I have a table Name with these columns and sample data:

ID      FIRSTNAME    SURNAME       FULLNAME     
---------------------------------------------------    
1       JOHN         PETER         JOHN PETER   
2       PETER        JACKSON       PETER JACKSON
3       JOHN         PAUL          JOHN PAUL
3       JOHN         SECONDNAME    JOHN SECONDNAME

Fullname is first name + space + last name and ID can repeat.

I want to add another column OTHERNAMES: it will CONCATENATE with ALL firstname and surnames of a person (ID) has with delimiter ;

Table should look like this in the end:

ID    FIRSTNAME    SURNAME       FULLNAME         OTHERNAMES 
------------------------------------------------------------------------    
1     JOHN         PETER         JOHN PETER       JOHN PETER 
2     PETER        JACKSON       PETER JACKSON    PETER JACKSON
3     JOHN         PAUL          JOHN PAUL        JOHN PAUL;JOHN SECONDNAME
3     JOHN         SECONDNAME    JOHN SECONDNAME  JOHN PAUL;JOHN SECONDNAME
like image 267
Aiden Avatar asked Jan 19 '26 13:01

Aiden


1 Answers

This design is awfull! Don't do that!

Just for completeness:

CREATE  TABLE MockUp(ID INT
                    ,FIRSTNAME VARCHAR(100)
                    ,SURNAME VARCHAR(100)
                    ,FullName AS FIRSTNAME + ' ' + SURNAME);

INSERT INTO MockUp VALUES  
 (1,'JOHN','PETER')
,(2,'PETER','JACKSON')
,(3,'JOHN','PAUL')
,(3,'JOHN','SECONDNAME');

SELECT ID 
      ,FIRSTNAME
      ,SURNAME
      ,FullName
      ,STUFF((SELECT '; ' + x.FullName FROM MockUp AS x WHERE x.ID=m.ID FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)'),1,2,'') AS OtherNames
FROM MockUp AS m
GO

DROP TABLE MockUp;

You see, that I added the FullName as computed column. The OtherNames are calculated on-the-fly. Do not store computeable data if you do not have a very good reason!

like image 105
Shnugo Avatar answered Jan 21 '26 05:01

Shnugo