【问题标题】:How do I find all combinations for an unknown number of options for a product?如何找到产品未知数量选项的所有组合?
【发布时间】:2020-01-27 04:55:49
【问题描述】:

我有一个包含 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

【问题讨论】:

    标签: sql sql-server combinations product options


    【解决方案1】:

    你需要一个递归 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;
    

    Here 是一个 dbfiddle。

    【讨论】:

    • 戈登,我一遍又一遍地重复最后的选项。例如,我正在获取最后一个选项是屏幕:半屏/其他选项的记录,然后我看到记录显示屏幕:半屏/屏幕:半屏/屏幕:半屏/屏幕:半屏/屏幕:半屏 / Option1 / Option2 依此类推。我想知道是否需要调整连接以一遍又一遍地消除这些重复的选项。
    • 好的,所以它似乎一遍又一遍地重复最后一个选项名称。我会在找到解决方案时通知您。
    • @Soiss 。 . .你看到 db fiddle 了吗?它不会重复上一个选项。
    • 我明白了!我的终结器出现问题,导致了大规模循环。感谢您的耐心和示例!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多