Reputation: 144
I am using SQL Server 2008, I have a dataset that look like:
FormKey Value Category
------- ----- ------
123456 Gloves PPE
123456 Hat PPE
123456 Scalf PPE
123456 Boots PPE
987654 Glasses PPE
987654 Harness PPE
987654 Overalls PPE
I am trying to concatenate the Values and group by FormKey, so that I would end up with:
Formkey Value Category
------- ----- -------
123456 Gloves, Hat, Scalf, Boots PPE
987654 Glasses, Harness, Overalls PPE
However, I am getting a concat of ALL of the Values for each of the Formkeys.
The code I have been using is:
SELECT frd.formresultkey AS frk
,STUFF((
SELECT ', ' + fra.value
FROM [FormResultAnswers] FRA
INNER JOIN [FormResultDetails] FRD ON FRA.[DetailKey] = FRD.[DetailKey]
INNER JOIN [FormResults] FR ON FRD.[FormResultKey] = FR.[FormResultKey]
WHERE FR.FormReference = 'PPE'
AND frd.FormElementReference = 'PPE_List'
FOR XML path('')
), 1, 1, '') AS Concatted
FROM [FormResultAnswers] FRA
INNER JOIN [FormResultDetails] FRD ON FRA.[DetailKey] = FRD.[DetailKey]
INNER JOIN [FormResults] FR ON FRD.[FormResultKey] = FR.[FormResultKey]
After this I need to update a table with the concatenated value where the Formkeys match. Can anyone help please?
Upvotes: 0
Views: 153
Reputation: 93694
Some modification to your query will fetch the result. Try this.
SELECT FormKey,
Stuff((SELECT ',' + Value
FROM Result b
WHERE a.FormKey = b.FormKey
AND a.Category = b.Category
FOR xml path('')), 1, 1, '') value,
Category
FROM Result a
GROUP BY FormKey,
Category
Upvotes: 1
Reputation: 5259
You can create two function to concatenate the values, like this:
IF EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'GroupValue'))
DROP FUNCTION GroupValue;
GO
IF EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'GroupCategory'))
DROP FUNCTION GroupCategory;
GO
CREATE FUNCTION dbo.GroupValue (@FormKey INT)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @VAL VARCHAR(MAX) = '';
SELECT @VAL = @VAL + Value + ', '
FROM (SELECT DISTINCT Value
FROM YourTable
WHERE FormKey = @FormKey) AS TT
IF (LEN(@VAL) > 0)
SET @VAL = LEFT(@VAL, LEN(@VAL) - 1)
RETURN @VAL
END
GO
CREATE FUNCTION dbo.GroupCategory (@Formkey INT)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @VAL VARCHAR(MAX) = '';
SELECT @VAL = @VAL + Category + ', '
FROM (SELECT DISTINCT Category
FROM YourTable
WHERE FormKey = @FormKey) AS TT
IF (LEN(@VAL) > 0)
SET @VAL = LEFT(@VAL, LEN(@VAL) - 1)
RETURN @VAL
END
GO
And here's the query:
SELECT FormKey
,dbo.GroupValue(FormKey) AS Value
,dbo.GroupCategory(FormKey) AS Category
FROM YourTable
GROUP BY FormKey;
Upvotes: 0