SQL server 12: Displaying column cell values in single cell
-
Column1 Column2 -------- ---------- Vaugh William Vaugh Smith Woods Jane Expected Output : Vaugh, William-Smith/Woods,Jane Condition : There could be n number of rows in the sample table, there could be n number of woods too. display all the common surname having different names meaning repeated Last names will be once then all the first names associated with it. truncated at 30 characters max. How can I get this output in SQL query ?
This sort of manipulation is best done in the UI, not the database. However, using the techniques from this blog post[^] leads to the following (rather ugly) solution:
SELECT
STUFF(
(SELECT '/' + Surname + ',' + STUFF(
(SELECT '-' + Forename
FROM YourTable As T2
WHERE T2.Surname = T1.Surname
ORDER BY T2.Forename
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '')
FROM YourTable As T1
GROUP BY Surname
ORDER BY Surname
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '') As CombinedNames
;
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
I want to display the unique last names followed by their respective first names separated by a '-' and, then '/' , then again the next last name(If it is not distinct , then add their first names separated by '-')followed by its respective firstname and so on..
-
This sort of manipulation is best done in the UI, not the database. However, using the techniques from this blog post[^] leads to the following (rather ugly) solution:
SELECT
STUFF(
(SELECT '/' + Surname + ',' + STUFF(
(SELECT '-' + Forename
FROM YourTable As T2
WHERE T2.Surname = T1.Surname
ORDER BY T2.Forename
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '')
FROM YourTable As T1
GROUP BY Surname
ORDER BY Surname
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '') As CombinedNames
;
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
I am getting the combined names for the whole table. How to restrict it for a single id? Can you please tell where should I put the condition in the code you have shown above ?
What do you mean by "a single id"? There's no mention of any column called "id" in your question, or any of the other messages in this thread.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
What do you mean by "a single id"? There's no mention of any column called "id" in your question, or any of the other messages in this thread.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
ID Column1 Column2 -- -------- ---------- 7 Vaugh William 7 Vaugh Smith 6 Woods Jane 6 Woods Joseph 6 Wright Adam 6 Wright John Suppose I have to find the combined name only for id=6 , then where should I put the condition in the code? The expected output : Woods,Jane-Joseph/Wright,Adam-John
-
ID Column1 Column2 -- -------- ---------- 7 Vaugh William 7 Vaugh Smith 6 Woods Jane 6 Woods Joseph 6 Wright Adam 6 Wright John Suppose I have to find the combined name only for id=6 , then where should I put the condition in the code? The expected output : Woods,Jane-Joseph/Wright,Adam-John
So the ID is the same for each surname? In that case, you just need to add a
WHERE
clause between theFROM YourTable As T1
andGROUP BY Surname
lines:SELECT
STUFF(
(SELECT '/' + Surname + ',' + STUFF(
(SELECT '-' + Forename
FROM YourTable As T2
WHERE T2.Surname = T1.Surname
ORDER BY T2.Forename
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '')
FROM YourTable As T1-- Filter here: WHERE T1.ID = @TheIDToFind GROUP BY Surname ORDER BY Surname FOR XML PATH(''), TYPE ).value('.', 'varchar(max)') , 1, 1, '') As CombinedNames
;
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
So the ID is the same for each surname? In that case, you just need to add a
WHERE
clause between theFROM YourTable As T1
andGROUP BY Surname
lines:SELECT
STUFF(
(SELECT '/' + Surname + ',' + STUFF(
(SELECT '-' + Forename
FROM YourTable As T2
WHERE T2.Surname = T1.Surname
ORDER BY T2.Forename
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '')
FROM YourTable As T1-- Filter here: WHERE T1.ID = @TheIDToFind GROUP BY Surname ORDER BY Surname FOR XML PATH(''), TYPE ).value('.', 'varchar(max)') , 1, 1, '') As CombinedNames
;
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
ID Column1 Column2 -- -------- ---------- 7 Vaugh William 7 Vaugh Smith 6 Woods Jane 6 Woods Joseph 6 Wright Adam 6 Wright John Thanks, I exactly put the condition at the place you suggeted, but still the output I get is as below WRONG OP : Vaugh,William-Smith/Woods,Jane-Joseph/Wright, Adam-John Expected OP : Woods,Jane-Joseph/Wright, Adam-John
-
ID Column1 Column2 -- -------- ---------- 7 Vaugh William 7 Vaugh Smith 6 Woods Jane 6 Woods Joseph 6 Wright Adam 6 Wright John Thanks, I exactly put the condition at the place you suggeted, but still the output I get is as below WRONG OP : Vaugh,William-Smith/Woods,Jane-Joseph/Wright, Adam-John Expected OP : Woods,Jane-Joseph/Wright, Adam-John
I've just tried the code here on your sample data, and I get the expected output.
DECLARE @T TABLE
(
ID int NOT NULL,
Surname varchar(10) NOT NULL,
Forename varchar(10) NOT NULL
);INSERT INTO @T (ID, Surname, Forename)
VALUES
(7, 'Vaugh', 'William'),
(7, 'Vaugh', 'Smith'),
(6, 'Woods', 'Jane'),
(6, 'Woods', 'Joseph'),
(6, 'Wright', 'Adam'),
(6, 'Wright', 'John')
;SELECT
STUFF(
(SELECT '/' + Surname + ',' + STUFF(
(SELECT '-' + Forename
FROM @T As T2
WHERE T2.Surname = T1.Surname
ORDER BY T2.Forename
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '')
FROM @T As T1
WHERE T1.ID = 6
GROUP BY Surname
ORDER BY Surname
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '') As CombinedNames
;-- Output:
-- Woods,Jane-Joseph/Wright,Adam-John
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
ID Column1 Column2 -- -------- ---------- 7 Vaugh William 7 Vaugh Smith 6 Woods Jane 6 Woods Joseph 6 Wright Adam 6 Wright John Thanks, I exactly put the condition at the place you suggeted, but still the output I get is as below WRONG OP : Vaugh,William-Smith/Woods,Jane-Joseph/Wright, Adam-John Expected OP : Woods,Jane-Joseph/Wright, Adam-John
Here's a SQL Fiddle with the same query, which also generates the correct output: http://sqlfiddle.com/#!3/300af/1[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
Here's a SQL Fiddle with the same query, which also generates the correct output: http://sqlfiddle.com/#!3/300af/1[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer