Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL将行从一个表分配到另一个表_Sql_Sql Server - Fatal编程技术网

SQL将行从一个表分配到另一个表

SQL将行从一个表分配到另一个表,sql,sql-server,Sql,Sql Server,我想使用TopLvlOrd字段上的排序将行从一个表分配到另一个表。输入为[订单]表和[缺陷]表。我想创建一个生成[Output]的SQL。即使经过一系列的在线调查,我也不知道该怎么做。我不想做光标,但如果有必要,我会去那里。有什么想法吗?使用SQL Server 2012 规则: 1由TopLvlOrd asc分配, 2为每个PegQty分配一个TopLvlOrd行 [命令] TopLvlOrd IntOrd PegQty ========= ====== ====== 67

我想使用TopLvlOrd字段上的排序将行从一个表分配到另一个表。输入为[订单]表和[缺陷]表。我想创建一个生成[Output]的SQL。即使经过一系列的在线调查,我也不知道该怎么做。我不想做光标,但如果有必要,我会去那里。有什么想法吗?使用SQL Server 2012

规则: 1由TopLvlOrd asc分配, 2为每个PegQty分配一个TopLvlOrd行

[命令]

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