Sql 我不明白你为什么需要一个函数。您在这里陈述的所有数据都可以存储在表中,然后通过简单的联接获取。 即使BOM是递归的,也可以使用CTE

Sql 我不明白你为什么需要一个函数。您在这里陈述的所有数据都可以存储在表中,然后通过简单的联接获取。 即使BOM是递归的,也可以使用CTE,sql,function,stored-procedures,iteration,Sql,Function,Stored Procedures,Iteration,如果坚持使用该函数,可以使用交叉应用对每一行调用该函数 到目前为止,我创建的唯一功能是创建 两列表格,填写同一销售中销售的所有部件 按特定桌面型号订购。你是在推荐我发帖吗 将该表的结果添加到另一个表中,并继续插入新的 函数的每个实例的行 我明白了,你不需要使用函数。 有很多不同的可能性 您可能非常熟悉的一个方法是将函数转换为SP并使用 INSERT INTO [TableName] EXEC [SP_NAME] 另一种方法是将查询转换为累加子查询或CTE(见下文) 和其他人一起参加 通常避免

如果坚持使用该函数,可以使用
交叉应用
对每一行调用该函数



到目前为止,我创建的唯一功能是创建 两列表格,填写同一销售中销售的所有部件 按特定桌面型号订购。你是在推荐我发帖吗 将该表的结果添加到另一个表中,并继续插入新的 函数的每个实例的行

我明白了,你不需要使用函数。 有很多不同的可能性

您可能非常熟悉的一个方法是将函数转换为SP并使用

INSERT INTO [TableName]
EXEC [SP_NAME]
另一种方法是将查询转换为累加子查询或CTE(见下文) 和其他人一起参加

通常避免每次都创建函数,因为它们会对数据库造成很大的破坏。

BOM表不是递归的。我对CTE不熟悉

当您有许多连接的子查询时,公共表表达式(CTE)是很好的工具,一旦您习惯了它们,它们将为复杂查询带来很多清晰度(IMO)。 CTE还提供对递归的本机支持。 网上有很多文章可以指导你。只需谷歌CTE expamples或CTE教程

我没有交叉申请的经验

交叉应用:从第页开始

APPLY运算符允许您为查询的外部表表达式返回的每一行调用表值函数

最后也是最重要的一点

任何例子都将不胜感激


如果您能给我您已经有的部分脚本,我将尝试将其转换为我想要指导您的查询。

谢谢您的建议。但是,如何使用您的格式为数据输入创建ASP.net GridView?我希望能够根据计算机类型、Jul_Num、Aug_Num和Sep_Num惯例显示和编辑“桌面”的所有数字。目前,我正在为每个列添加一个新的ItemTemplate,该列明确标记为Jul_Num等。感谢您的建议。但是,如何使用您的格式为数据输入创建ASP.net GridView?我希望能够根据计算机类型、Jul_Num、Aug_Num和Sep_Num惯例显示和编辑“桌面”的所有数字。目前,我正在为每个列添加一个新的ItemTemplate,该列明确标记为Jul_Num等。到目前为止,我创建的唯一功能是创建一个两列表,其中填充了与特定桌面型号相同的销售订单上销售的所有组件。您是否建议我将该表的结果发布到另一个表中,并继续为函数的每个实例插入新行?BOM表不是递归的。我对CTE不熟悉。我没有交叉申请的经验。任何例子都将不胜感激。@user2547072,你问的问题太多了,只是为了一个评论,请查看我的扩展编辑答案。路易斯,谢谢你给我指出CTE的!!!只要我能找到,我就会欣赏可读性更强的代码。你改变了我的编程风格@用户2547072如果您将我的回复标记为已接受,我将不胜感激?我现在开始参与Stackoverflow,我看到获得的分数对我如何参与产生了影响。到目前为止,我创建的唯一功能是创建一个两列表,其中包含在同一销售订单上作为特定桌面型号销售的所有组件。您是否建议我将该表的结果发布到另一个表中,并继续为函数的每个实例插入新行?BOM表不是递归的。我对CTE不熟悉。我没有交叉申请的经验。任何例子都将不胜感激。@user2547072,你问的问题太多了,只是为了一个评论,请查看我的扩展编辑答案。路易斯,谢谢你给我指出CTE的!!!只要我能找到,我就会欣赏可读性更强的代码。你改变了我的编程风格@用户2547072如果您将我的回复标记为已接受,我将不胜感激?我现在开始参加Stackoverflow,我看到获得的分数对我如何参与有影响
Desktop  100  200  150  
Laptop   300  400  700
CPU        1  (This means we sell 1 CPU with every desktop)  
Hard Drive 2  (We sell 2 with every desktop)  
Printer    .8 (80% of the time we sell a printer)
CPU         400  600  850  
Hard Drive  500  800  1000
ABC CPU          3  3   1
ABC Hard Drive   6  3   2
DEF CPU          2  2   1
DEF Hard Drive   2  2   1
MNO CPU          1  1   1
MNO Hard Drive   1  1   1
XYZ CPU          1  1   1
XYZ Hard Drive   2  1   2
SELECT        All_Components.Model_Num, All_Components.Part_Num, SUM(All_Components.Qty) AS Total, TTO.Target_Total, SUM(All_Components.Qty) 
                     / TTO.Target_Total AS Comp_Percent
FROM            (SELECT        Test_tbl_Computers.Model_Num, Test_tbl_Orders_2.Order_Num, Test_tbl_Orders_2.Part_Num, Test_tbl_Orders_2.Qty
                      FROM            Test_tbl_Orders AS Test_tbl_Orders_2 CROSS JOIN
                                                Test_tbl_Computers) AS All_Components INNER JOIN
                         (SELECT        Test_tbl_Orders.Part_Num, SUM(Test_tbl_Orders.Qty) AS Target_Total
                           FROM            Test_tbl_Orders INNER JOIN
                                                     Test_tbl_Computers AS Test_tbl_Computers_1 ON Test_tbl_Orders.Part_Num = Test_tbl_Computers_1.Model_Num
                           GROUP BY Test_tbl_Orders.Part_Num) AS TTO ON All_Components.Model_Num = TTO.Part_Num
WHERE        (All_Components.Order_Num IN
                         (SELECT        Order_Num
                           FROM            Test_tbl_Orders AS Test_tbl_Orders_1
                           WHERE        (Part_Num = All_Components.Model_Num))) AND (All_Components.Part_Num <> All_Components.Model_Num)
INSERT INTO [TableName]
EXEC [SP_NAME]