简体   繁体   中英

SQL Server 2008 concatenate rows to column

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?

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 

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;

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-2024 STACKOOM.COM