Как мне найти все комбинации для неизвестного количества опций для продукта? - PullRequest
1 голос
/ 27 сентября 2019

У меня есть таблица с 3 столбцами: Model_Name, Style_Name и Option_Name.Как объединить все доступные комбинации Option_Names, сгруппированные по Model_Name и Style_Name?То, что я пытаюсь сделать, это перечислить продукт со всеми возможными комбинациями опций в отдельных строках.

Я пытался использовать STRING_AGG(Option_Name, ' / ') WITHIN GROUP, но это просто объединяет все Option_Names.

Таблица будет выглядеть следующим образом.

Model_Name  | Style_Name | Option_Name 
7000 Series | Front Door | White
7000 Series | Front Door | Extra Lock 
7000 Series | Front Door | Foam Filler

В идеале мы должны вернуть все комбинации с использованием SQL Server.

7000 Series | Front Door | White
7000 Series | Front Door | White / Extra Lock
7000 Series | Front Door | White / Foam Filler
7000 Series | Front Door | White / Extra Lock / Foam Filler
7000 Series | Front Door | Extra Lock
7000 Series | Front Door | Extra Lock / Foam Filler
7000 Series | Front Door | Foam Filler

и т. Д.

SELECT Model_Name, Style_Name
  , STRING_AGG(CAST(Option_Name AS VARCHAR(MAX)), ' / ') WITHIN GROUP (ORDER BY Model_Name, Style_Name) Option_Name 
FROM [dbo].[Product_Option_Master]
GROUP BY Model_Name, Style_Name
ORDER BY Model_Name, Style_Name

Это просто возвращает

7000 Series | Front Door | White / Extra Lock / Foam Filler

1 Ответ

1 голос
/ 27 сентября 2019

Вам нужен рекурсивный CTE:

with cte as (
      select model_name, style_name, option_name, convert(varchar(max), option_name) as option_names
      from Product_Option_Master pom
      union all
      select cte.model_name, cte.style_name, pom.option_name,
             convert(varchar(max), concat(cte.option_names, ' / ', pom.option_name))
      from cte join
           Product_Option_Master pom
           on pom.model_name = cte.model_name and
              pom.style_name = cte.style_name and
              pom.option_name > cte.option_name
     )
select *
from cte;

Здесь - это скрипта db <>.

...