SQL Server:无循环的排列/组合

2024-01-10

我有两个数据集。第一个是产品配方表以及构成该配方的产品。第二个数据集包含按产品分类的单独定价(我可以为单个产品设置多个价格)。

我想要实现的是输出一个结果集,其中包含每个产品配方的独特排列。只有所有组件在第二个数据集中都有定价的配方才应出现在输出中。

假设:单个配方最多可以配置 5 个组件(不能更多)。

DECLARE @ProductRecipe TABLE (ProductRecipeID INT, ComponentProductID INT)

INSERT INTO @ProductRecipe (ProductRecipeID, ComponentProductID) 
VALUES (21, 130), (21, 468), (21, 500), 
       (22, 468), (22, 500), 
       (23, 130), (23, 501)

DECLARE @ComponentPricing TABLE (PricingID INT, ProductID INT)

INSERT INTO @ComponentPricing (PricingID, ProductID)
VALUES (314023, 130), (313616, 130), (313071, 130),
       (312865, 130), (316323, 468), (316329, 468), (398864, 500)

我希望我的输出看起来像这样:

输出示例

我尝试过 CTE 和自连接,但我什至无法接近我想要的输出..:(

我正在使用 SQL Server 2012


我假设您正在使用 SQL Server 2008 或更高版本,这是使dense_rank() https://learn.microsoft.com/en-us/sql/t-sql/functions/dense-rank-transact-sql?view=sql-server-2017功能工作。

下面的解决方案经历了评论中概述的几个步骤。一个问题是我改变了其中之一@ProductRecipe记录来自(22, 130) to (22, 468)因为我相信它是预期的样本数据,因为Component1所需输出包括PricingID值 316323 和 316329。

Answer:

DECLARE @ProductRecipe TABLE (ProductRecipeID INT, ComponentProductID INT)
INSERT INTO @ProductRecipe (ProductRecipeID, ComponentProductID) VALUES (21, 130)
INSERT INTO @ProductRecipe (ProductRecipeID, ComponentProductID) VALUES (21, 468)
INSERT INTO @ProductRecipe (ProductRecipeID, ComponentProductID) VALUES (21, 500)
INSERT INTO @ProductRecipe (ProductRecipeID, ComponentProductID) VALUES (22, 468) --values were (22, 130) in question
INSERT INTO @ProductRecipe (ProductRecipeID, ComponentProductID) VALUES (22, 500)
INSERT INTO @ProductRecipe (ProductRecipeID, ComponentProductID) VALUES (23, 130)
INSERT INTO @ProductRecipe (ProductRecipeID, ComponentProductID) VALUES (23, 501)

DECLARE @ComponentPricing TABLE (PricingID INT, ProductID INT)
INSERT INTO @ComponentPricing (PricingID, ProductID)
VALUES (314023, 130)
 , (313616, 130)
 , (313071, 130)
 , (312865, 130)
 , (316323, 468)
 , (316329, 468)
 , (398864, 500)

; with base as
    (
        --Joining the two datasets together.
        select pr.ProductRecipeID
        , pr.ComponentProductID
        , cp.PricingID
        from @ProductRecipe as pr
        left join @ComponentPricing as cp on pr.ComponentProductID = cp.ProductID   
    )
    , pr_exclude as
    (
        --Identifying that ProductRecipeID 23 should be excluded because of the 501 NULL value
        select distinct b.ProductRecipeID
        from base as b
        where b.PricingID is null   
    )
    , final_base as
    (
        --Assigning Rank to each ComponentProductID
        select b.ProductRecipeID
        , b.ComponentProductID
        , b.PricingID
        , dense_rank() over (partition by b.ProductRecipeID order by b.ComponentProductID asc) as prod_rnk
        from base as b
        left join pr_exclude as p on b.ProductRecipeID = p.ProductRecipeID
        where 1=1
        and p.ProductRecipeID is null
    )
--Joining it all together
select a.ProductRecipeID
, a.PricingID as Component1
, b.PricingID as Component2
, c.PricingID as Component3
, d.PricingID as Component4
, e.PricingID as Component5
from final_base as a
left join final_base as b on a.ProductRecipeID = b.ProductRecipeID and b.prod_rnk = 2
left join final_base as c on b.ProductRecipeID = c.ProductRecipeID and c.prod_rnk = 3
left join final_base as d on c.ProductRecipeID = d.ProductRecipeID and d.prod_rnk = 4
left join final_base as e on d.ProductRecipeID = e.ProductRecipeID and e.prod_rnk = 5
where a.prod_rnk = 1
order by 1, 2, 3, 4, 5, 6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server:无循环的排列/组合 的相关文章

  • 水晶报表参数选择有限制吗?

    我正在尝试根据按用户分组的 Oracle 数据库制作 Crystal Reports 11 报告 我有超过一千个用户 我想创建一个参数字段 提示用户选择他们想要查看其结果的用户 但是我的参数选择字段仅显示 221 个可能的用户 由于 SQL
  • 将 MS SQL Server 数据库连接到 Oracle 11g 数据库

    我正在努力创建从 Oracle 数据库到一个 SQL Server 的数据库链接 为此 我添加了以下内容 In file tnsnames ora sqlUserConn DESCRIPTION ADDRESS PROTOCOL tcp H
  • 将数据库表转换为 XML 模式文件

    我正在使用 SQL Server 2005 是否有任何命令或 GUI 工具 例如 SQL Server Management Studio 中的任何菜单 功能 可以将数据库表转换为 XML 架构文件 xsd 提前致谢 乔治 我找到了这个 试
  • 跨数据库管理系统检查字符串是否为数字的方法

    好的 我有这个字段 code varchar 255 它包含我们导出例程中使用的一些值 例如 DB84 DB34 3567 3568 我需要仅选择自动生成的 全数字 字段 WHERE is numeric table code is num
  • 单笔交易与多笔交易[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 mysql 查询输出存储到 shell 变量中

    我需要一个变量来保存从数据库检索的结果 到目前为止 这基本上是我正在尝试但没有成功的事情 myvariable mysql database u user p password SELECT A B C FROM table a 正如你所看
  • Oracle SQL 查询日期格式

    我总是对 ORACLE SQL 查询中的日期格式感到困惑 并花几分钟时间去谷歌 有人可以向我解释当数据库表中有不同格式的日期时解决问题的最简单方法吗 例如 我有一个日期列为 ES DATE 保存的数据为 27 APR 12 11 52 48
  • 如何在 PostgreSQL 中生成月份列表?

    我有一张桌子A with startdate列是TIMESTAMP WITHOUT TIME ZONE我需要编写一个查询 函数来生成月份列表MIN列的值直到MAX列的值 例如 startdate 2014 12 08 2015 06 16
  • WP_Query 相同的请求,不同的语法 - 其中之一不起作用

    我有一个运行良好的 WP Query args array post type gt product meta key gt product subtype meta value gt public compare gt 但当我想搜索多个m
  • 如何获取数字列的确切类型,包括。规模和精度?

    有没有办法知道列中列的确切类型DataTable 现在我正在这样做 DataTable st dataReader GetSchemaTable foreach DataColumn col in st Columns var type c
  • 是否可以在MySQL UDF中的IF条件中声明游标

    我可以在 if 语句中声明游标吗 如果可能的话我怎样才能做到 因为我刚刚做了这样的光标 CREATE FUNCTION fn test ProductID BIGINT 20 RETURNS DECIMAL 10 2 BEGIN DECLA
  • 了解 Oracle Apex_Application.G_Fnn 以及如何使用它

    我对 Oracle apex application gfnn 的工作原理以及它是否仅适用于 Oracle ApEx 中的标准 SQL 报告或仅适用于 SQL 可更新报告 即表格形式 感到非常困惑 基本上我试图使用这个示例 SQL 来实现以
  • Informix:带有输出参数的程序?

    我搜索了很多 但找不到任何东西 我只是想问是否有任何方法可以创建和调用过程 Informix 没有参数 我知道如何返回一个或多个值 对于过程和函数 但这不是我想要的 如果 Informix 不允许输出参数 那就真的很奇怪了 提前致谢 EDI
  • 编写 PHP SQL 更新语句的最佳方法

    我有这个 PHP SQL 语句 updateCategory UPDATE category SET name name description description parent parent active active WHERE i
  • T-SQL - 字符串连接

    希望有人可以提供帮助 我是一个新手 SQL 黑客 而且确实很糟糕 我在 SQL Server 2005 上有两个表 TABLE 1 和 TABLE2 TABLE1 COL1 COL2 1 10 2 20 3 30 4 10 4 20 5 2
  • SQL Server 存储过程对象名称无效

    我在尝试修改现有存储过程时收到此错误 Invalid object name dbo BackupDB 我能够创建此存储过程 但是当我单击修改选项来修改此存储过程时 系统显示了上述错误 您会看到所附图片 当尝试执行此命令时 我也遇到同样的错
  • ORACLE 在立即执行中批处理 DDL 语句

    我正在尝试在一个 Execute Immediate 语句中运行多个 ddl 语句 我认为这会很简单 但看来我错了 想法是这样的 declare v cnt number begin select count into v cnt from
  • 大表的最佳主键格式

    我正在开发一个 ASP NET 应用程序 它有一些可能很大的数据表 我想知道定义主键的最佳方法是什么 我知道以前已经有人问过这个问题 但由于这是针对特定情况的 所以我认为这个问题是有效的 我在 SQL Server 2008 数据库上使用实
  • 没有特定表的MSSQL数据库备份

    我需要在 sql 中没有特定表的情况下进行计划备份 因为如果我对该表进行备份 将需要很长时间 我需要从备份中排除一张表 是否可以 如果没有该表 所有表和数据都应该位于数据库中 除了 PRIMARY 文件组之外 您还可以为该表设置一个单独的文
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下

随机推荐

  • 识别批处理文件的运行实例

    这些对我不起作用 有什么帮助可以明确纠正以下四个示例吗 即使我打开了三个 CMD exe EXAMPLE01 也只是回显 继续 示例 01 echo off wmic process where name cmd exe find cmd
  • 依赖于自身的 Spark 窗口函数

    假设我在 DataFrame 中有一列已排序的时间戳 我想编写一个函数 向该 DataFrame 添加一列 根据以下规则将时间戳切割成连续的时间片 从第一行开始并继续迭代到最后 对于每一行 如果您在当前组中走了 n 行 或者您在当前组中走了
  • 获取从星期日开始的周数

    我目前有这样的代码 我可以通过添加和减去按钮获取周数以及该周的开始 结束日 Date prototype getWeekNumber function var d new Date Date UTC this getFullYear thi
  • Razor:条件语句中的 标记引发错误

    if Model Property null
  • Jenkins“仅在构建成功时才运行”对于不成功的构建仍然运行

    我正在使用 Jenkins 进行持续集成 并且我有一些具有上游和下游构建连接的项目 我已选择Run only if build succeeds在每个项目的配置中 然而 构建后步骤仍然会因不稳定的构建而被触发 詹金斯版本是 1 480 3
  • 使用循环数组实现队列:调整循环数组大小的最佳方法是什么?

    我正在实施一个使用循环数组进行队列 我有点陷入困境resize 方法实现 当数组已满时 在 的里面enqueue 方法我检查数组的大小是否等于它的长度 并获取它是否已满 现在 我不再抛出异常 而是尝试调整数组的大小 问题是 我有两种情况要考
  • postgresql 中 array_agg 的子选择

    有没有办法在 Postgresql 9 2 的having子句中使用聚合函数的值 例如 我想得到每个monkey id第二高的number gt 123 也是第二高的数字 在下面的示例中 我想获取 monkey id 1 number 22
  • 使用 AddDistributedRedisCache 时设置 IDistributedCache.SetAsync 的过期时间

    我正在使用 net core api 2 1 和 aws redis 缓存 我没有找到设置过期时间的方法IDistributedCache SetAsync https learn microsoft com en us dotnet ap
  • 在 iOS 中使用相机检测物体并使用 ARKit 定位 3D 物体

    我在寻找什么 我的要求的简单解释是这样的 使用 ARKit 使用 iPhone 相机检测对象 找到这个物体在这个虚拟空间上的位置 使用 SceneKit 将 3D 对象放置在该虚拟空间上 3D 对象应该位于 标记 一个示例是使用相机检测 3
  • 方向改变时出现的键盘问题

    在我的应用程序中 我使用各种编辑文本和文本视图以及列表视图 现在我的问题是我的键盘在方向改变时再次出现 理想情况下 当用户最小化键盘时 设备倾斜时键盘应处于最小化状态 但它又出现了 我们如何处理这种情况 我的另一个问题是我的编辑文本之一是屏
  • Express js 应用程序与 nginx - 提供子文件夹时与静态文件发生冲突

    upstream app server localhost 3000 server If I comment this location out images are displayed on the website location jp
  • 从调用范围中提取变量的字符串格式化程序是不好的做法吗?

    我有一些代码可以进行大量的字符串格式化 通常 我最终会得到如下代码 format x x y y z z foo foo 我试图将大量变量插入一个大字符串中 是否有充分的理由不编写这样一个使用inspect模块查找要插值的变量 import
  • Unix 中的作业和进程有什么区别?

    和有什么区别job and a process在Unix 中 你能举个例子吗 作业是由 shell 启动的进程 shell 在作业表中跟踪这些内容 这jobs命令显示活动后台进程的列表 他们获得的作业规范编号不是进程的 PID 命令如fg使
  • 根据 R 中的日期通过线性插值进行数据插补

    我有一个来自不同地块的矿物氮值的大型数据集 其中包括一些我们无法采样的日期缺失的数据 众所周知 土壤中的矿物质氮值会发生变化linearly采样之间 为了简化起见 我创建了一个数据框 其中有 10 个图 其中有 4 个日期 它们之间的距离不
  • 如何合并/更新 boost::property_tree::ptree?

    我已经阅读了 boost property tree 的文档 但没有找到更新或合并 ptree 与另一个 ptree 的方法 我该怎么做呢 给出下面的代码 update ptree 函数会是什么样子 include
  • JFrame:获取无边框大小?

    在Java中 是否可以获取没有标题和其他边框的JFrame的宽度和高度 frame getWidth 和frame getHeight 1 似乎返回包括边框的宽度 Thanks frame getContentPane getSize
  • Python threading.Event() - 确保所有等待线程在 event.set() 上唤醒

    我有许多线程等待事件 执行某些操作 然后再次等待事件 另一个线程将在适当的时候触发该事件 我无法找到一种方法来确保每个等待线程在设置事件时恰好触发一次 我目前已将触发线程设置为休眠一段时间 然后清除它 不幸的是 这会导致等待线程多次抓取设置
  • 如果在 IE9 中查看,请替换脚本?

    根据用户浏览器运行不同的 JavaScript 有多容易 例如 如果有人使用 IE9 访问该网站 我希望它运行与 Chrome 用户正常运行的脚本不同的脚本 您可以使用有条件的评论 http www quirksmode org css c
  • Google Cloud“ascii”编解码器在安装过程中无法解码字节 0xe1

    我正在尝试安装 GoogleCloudSDK 但在安装过程中出现以下错误 Output folder C Program Files x86 Google Cloud SDK Downloading Google Cloud SDK cor
  • SQL Server:无循环的排列/组合

    我有两个数据集 第一个是产品配方表以及构成该配方的产品 第二个数据集包含按产品分类的单独定价 我可以为单个产品设置多个价格 我想要实现的是输出一个结果集 其中包含每个产品配方的独特排列 只有所有组件在第二个数据集中都有定价的配方才应出现在输