SQL Server 2008 concatenate rows to column

社会主义新天地 提交于 2019-12-11 16:19:49

问题


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?


回答1:


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 



回答2:


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;


来源:https://stackoverflow.com/questions/27922448/sql-server-2008-concatenate-rows-to-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!