首页 > 解决方案 > 如何找到产品未知数量选项的所有组合?

问题描述

我有一个包含 3 列的表,Model_Name、Style_Name 和 Option_Name。如何连接按 Model_Name 和 Style_Name 分组的 Option_Names 的所有可用组合?我正在尝试做的是在单独的行中列出具有所有可能选项组合的产品。

我一直在尝试使用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

标签: sqlsql-servercombinationsproductoptions

解决方案


您需要递归 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<>fiddle。


推荐阅读