2015-01-13 3 views
0

Я использую SQL Server 2008, у меня есть набор данных, который выглядит следующим образом:SQL Server 2008 Соединить строки в колонке

FormKey  Value  Category 
-------  -----  ------ 
123456   Gloves  PPE 
123456   Hat  PPE 
123456   Scalf  PPE 
123456   Boots  PPE 
987654   Glasses PPE 
987654   Harness PPE 
987654   Overalls PPE 

Я пытаюсь конкатенации значений и группы от FormKey, так что я бы в конечном итоге с:

Formkey  Value      Category 
-------  -----      ------- 
123456  Gloves, Hat, Scalf, Boots  PPE 
987654  Glasses, Harness, Overalls PPE 

Однако, я получаю конкат всех значений для каждой из форм-ключей.

код я использую это:

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] 

После этого мне нужно обновить таблицу с каскадным значения, где матч Formkeys. Может ли кто-нибудь помочь?

+2

Бьюсь об заклад, вы знаете, что плохая идея иметь значения с разделителями-запятыми, хранящиеся в столбце, не так ли? –

+0

Не могли бы вы добавить группу по formkey там – Matt

+0

Спасибо, Matt, но результат возвращает concat каждого значения строки для каждого formresultkey, я добавил группу по frk в конце инструкции, но все равно получаю каждое значение объединяются для каждого отдельного frk. Спасибо за ваше предложение – user3735855

ответ

1

Некоторые модификации на ваш запрос будет получать результат. Попробуй это.

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 
+0

Спасибо @NoDisplayName, это было где я был почти на. Большое спасибо. – user3735855

0

Вы можете создать две функции для конкатенации значения, как это:

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 

И вот вопрос:

SELECT FormKey 
     ,dbo.GroupValue(FormKey) AS Value 
     ,dbo.GroupCategory(FormKey) AS Category 
FROM YourTable 
GROUP BY FormKey; 
+0

Это не отвечает на вопрос (почему существующий код не дает ожидаемого результата), а также неэффективен при объединении строковых значений. Фактически, использование XML - это самый быстрый способ агрегирования строк, доступных в настоящее время в SQL Server на несколько порядков –

+0

@PanagiotisKanavos. Я не вижу вопроса «почему существующий код не дает ожидаемого результата». И это дает точно ожидаемый результат. – dario

+0

Нет ничего плохого в использовании FOR XML для создания строк. Изменение метода не является необходимым, и на самом деле метод конкатенации переменных считается ненадежным. Существует даже соответствующая [статья Microsoft KB об этом] (http://support2.microsoft.com/kb/287515/en-us). Что касается скорости, [эта статья] (http://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation) показывает, что FOR XML в 4 раза быстрее –

Смежные вопросы