SQL Server: объединение в строки через.поле через запятую - PullRequest
2 голосов
/ 14 июня 2011

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

Заказать

OrderID   OrderNumber
   1         OX101 
   2         OX102

OrderItem

OrderItemID  OrderID   OptionCodes
     1          1      12,14,15
     2          1      14
     3          2      15

Опция

OptionID   Description
    12      Batteries
    14      Gift wrap
    15      Case
[etc.]

Что мне нужно, так это одна строка для позиции заказа , которая включает в себя объединенное поле с описанием каждой опции. Вот как то так:

OrderItemID   OrderNumber   Options
    1            OX101      Batteries\nGift Wrap\nCase
    2            OX101      Gift Wrap
    3            OX102      Case

Конечно, это осложняется тем фактом, что параметры представляют собой строковое поле, разделенное запятыми, а не правильную таблицу поиска. Поэтому мне нужно разделить это запятыми, чтобы объединить таблицу параметров, а затем объединить результат обратно в одно поле.

Сначала я попытался создать функцию, которая разделяет данные опций через запятую и возвращает их в виде таблицы. Хотя я смог соединить результат этой функции с таблицей параметров, я не смог передать столбец OptionCodes в функцию в соединении, поскольку казалось, что он работает только с объявленными переменными или жестко заданными значениями.

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

2 голосов
/ 14 июня 2011

Я бы использовал функцию расщепления (здесь пример ), чтобы получить отдельные значения и сохранить их в CTE. Затем вы можете присоединить CTE к вашему столу под названием «Option».

SELECT * INTO #Order
FROM (
  SELECT 1 OrderID, 'OX101' OrderNumber UNION SELECT 2, 'OX102'
) X;

SELECT * INTO #OrderItem
FROM (
  SELECT 1 OrderItemID, 1 OrderID, '12,14,15' OptionCodes
  UNION
  SELECT 2, 1, '14'
  UNION
  SELECT 3, 2, '15'
) X;

SELECT * INTO #Option
FROM (
  SELECT 12 OptionID, 'Batteries' Description
  UNION
  SELECT 14, 'Gift Wrap'
  UNION
  SELECT 15, 'Case'
) X;

WITH N AS (
  SELECT I.OrderID, I.OrderItemID, X.items OptionCode
  FROM #OrderItem I CROSS APPLY dbo.Split(OptionCodes, ',') X
)
SELECT Q.OrderItemID, Q.OrderNumber,
       CONVERT(NVarChar(1000), (
         SELECT T.Description + ','
         FROM N INNER JOIN #Option T ON N.OptionCode = T.OptionID
         WHERE N.OrderItemID = Q.OrderItemID
         FOR XML PATH(''))
       ) Options
FROM (
  SELECT N.OrderItemID, O.OrderNumber
  FROM #Order O INNER JOIN N ON O.OrderID = N.OrderID
  GROUP BY N.OrderItemID, O.OrderNumber) Q

DROP TABLE #Order;
DROP TABLE #OrderItem;
DROP TABLE #Option;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...