SQL将行从一个表分配到另一个表
我想使用TopLvlOrd字段上的排序将行从一个表分配到另一个表。输入为[订单]表和[缺陷]表。我想创建一个生成[Output]的SQL。即使经过一系列的在线调查,我也不知道该怎么做。我不想做光标,但如果有必要,我会去那里。有什么想法吗?使用SQL Server 2012 规则: 1由TopLvlOrd asc分配, 2为每个PegQty分配一个TopLvlOrd行 [命令]SQL将行从一个表分配到另一个表,sql,sql-server,Sql,Sql Server,我想使用TopLvlOrd字段上的排序将行从一个表分配到另一个表。输入为[订单]表和[缺陷]表。我想创建一个生成[Output]的SQL。即使经过一系列的在线调查,我也不知道该怎么做。我不想做光标,但如果有必要,我会去那里。有什么想法吗?使用SQL Server 2012 规则: 1由TopLvlOrd asc分配, 2为每个PegQty分配一个TopLvlOrd行 [命令] TopLvlOrd IntOrd PegQty ========= ====== ====== 67
TopLvlOrd IntOrd PegQty
========= ====== ======
67 25 3
120 25 1
111 25 1
16 25 1
127 25 1
127 65 1
127 85 1
[缺陷]
DefectID IntOrd TotQty
======== ====== ======
1 25 10
2 25 10
3 25 10
4 25 10
5 25 10
6 25 10
7 25 10
8 25 10
9 25 10
10 25 10
11 65 1
12 85 2
13 85 2
[输出]
DefectID IntOrd TotQty TopLvlOrd
======== ====== ====== =========
1 25 10 16
2 25 10 67
3 25 10 67
4 25 10 67
5 25 10 111
6 25 10 120
7 25 10 127
8 25 10 NULL
9 25 10 NULL
10 25 10 NULL
11 65 1 127
12 85 2 127
13 85 2 NULL
这回答了问题的原始版本 我认为您希望加入一个隐式序列号,您可以使用row_number添加该序列号:
请下次再提一个问题。请检查此查询:
SELECT DefectID, IntOrd,
TotQty, TopLvlOrd, PegQty
FROM
(
SELECT B. DefectID, COALESCE (A.IntOrd, B. IntOrd) IntOrd,
B.TotQty, A. TopLvlOrd, A.PegQty FROM
(
SELECT TopLvlOrd ,IntOrd, ROW_NUMBER () OVER (PARTITION By IntOrd ORDER by
TopLvlOrd) Num, PegQty FROM Orders
) A
FULL JOIN
(
SELECT DefectID , IntOrd ,TotQty, ROW_NUMBER () OVER (PARTITION By IntOrd ORDER by
TotQty) Num FROM Orders
) B
ON A. IntOrd=B.IntOrd AND A.Num=B.Num
)C
JOIN
master.dbo.spt_values Tab
ON Tab.type='P' AND Tab.number<C.PegQty
请解释你使用的规则。我意识到我遗漏了这个问题的PegQty字段部分。我已经添加了这一点,也添加了我试图实现的规则。是的,我认为我需要分解出[订单],因此PegQty始终为1。例如,将TopLvlOrd 67分解为3行,PegQuantity.=1。也许可以使用本文中所述的CTE:请原谅我的无知,我不确定如何将CTE与代码建议组合成一个SQL语句。太棒了。我不知道你能做到。我稍微修改了这个问题,但我认为这回答了原来的问题。不确定如何将此答案扩展到新规则?[Output]已更改,以便TopLvlOrd按PegQuantity重复。67在输出中重复3次。太棒了。我不知道你能做到。我稍微修改了这个问题,但我认为这回答了原来的问题。不确定如何将此答案扩展到新规则?@user3093820。我不回答修改过的问题。更好的办法是在一个问题被回答后接受一个答案,然后再问一个新问题。我是这个论坛的新手,所以仍然在学习正确的礼仪。@user3093820。我很好奇你为什么不接受这个答案?谢谢你提供的信息。这适用于我的情况,只需稍加修改。我学到了很多。我以后会避免修改帖子。
SELECT B. DefectID, COALESCE (A.IntOrd, B. IntOrd) IntOrd,
B.TotQty, A. TopLvlOrd FROM
(
SELECT TopLvlOrd ,IntOrd , ROW_NUMBER () OVER (PARTITION By IntOrd ORDER by TopLvlOrd) Num FROM Orders
) A
FULL JOIN
(
SELECT DefectID , IntOrd ,TotQty, ROW_NUMBER () OVER (PARTITION By IntOrd ORDER by TotQty) Num FROM Orders
) B
ON A. IntOrd=B.IntOrd AND A. Num=B.Num
SELECT DefectID, IntOrd,
TotQty, TopLvlOrd, PegQty
FROM
(
SELECT B. DefectID, COALESCE (A.IntOrd, B. IntOrd) IntOrd,
B.TotQty, A. TopLvlOrd, A.PegQty FROM
(
SELECT TopLvlOrd ,IntOrd, ROW_NUMBER () OVER (PARTITION By IntOrd ORDER by
TopLvlOrd) Num, PegQty FROM Orders
) A
FULL JOIN
(
SELECT DefectID , IntOrd ,TotQty, ROW_NUMBER () OVER (PARTITION By IntOrd ORDER by
TotQty) Num FROM Orders
) B
ON A. IntOrd=B.IntOrd AND A.Num=B.Num
)C
JOIN
master.dbo.spt_values Tab
ON Tab.type='P' AND Tab.number<C.PegQty