sql - 如何找到产品未知数量选项的所有组合?
问题描述
我有一个包含 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
解决方案
您需要递归 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。
推荐阅读
- c# - 在 FileStream 上撤消 DeleteOnClose
- javascript - Angular - 渲染没有FormArray的子控件集合?
- typescript - 如何检查打字稿中的空字符串
- hadoop - 为什么在伪分布式模式下需要 hadoop 命令?
- java - 当两种类型不同时如何将一个哈希映射的值放入另一个哈希映射
- php - 检查 where 子句 SQL PHP 中的拼写错误
- r - 将“2014-05”转换为日期格式为“2015 年 5 月”,以便在 R 中的 ggplot 中显示
- javascript - 在render()中显示featch json数据时反应本机错误
- java - 没有数组的序列中的最大最小奇数
- linux - 批处理文件转换为 Linux 脚本