Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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,我正试图通过销售产品中包含的包装来减少存储空间 产品可以有不同数量的相同包装,发票可以有不同数量的产品在单独的行中。应针对某些invoiceID执行操作 简化表格(摘要不是列,只是为了简化计算而添加): 我尝试的是: UPDATE Storage SET Storage.Qty = Storage.Qty - (SELECT SUM (Inv_rows.Qty * Pack_to_prod.Qty) FROM Inv_rows WHERE Inv_rows.

我正试图通过销售产品中包含的包装来减少存储空间

产品可以有不同数量的相同包装,发票可以有不同数量的产品在单独的行中。应针对某些invoiceID执行操作

简化表格(摘要不是列,只是为了简化计算而添加):

我尝试的是:

UPDATE Storage
     SET Storage.Qty = Storage.Qty - 
    (SELECT SUM (Inv_rows.Qty * Pack_to_prod.Qty) FROM Inv_rows
         WHERE Inv_rows.ProdID IN (SELECT ProdID FROM Pack_to_prod 
     WHERE Pack_to_prod.PackID=Storage.ItemID) AND Inv_rows.InvId = 999
    )
     FROM Inv_rows, Storage, Pack_to_prod
     WHERE Inv_rows.ProdID = Pack_to_prod.ProdID
     AND Pack_to_prod.PackID = Storage.ItemID
     AND Inv_rows.InvID = 999
但问题是'IN'与行不匹配,但我不能将'='用作多行结果的'where'

然后我试着用select子句为自己简化它(因为我不是专业人士),以了解到底需要做什么

SELECT 
Pack_to_prod.PackID AS PackageID,
Inv_rows.ProdID AS ProductID,
Inv_rows.Qty AS ProductQty, 
Pack_to_prod.Qty AS PackageQtyPerProduct, 
Inv_rows.Qty*Pack_to_prod.Qty AS PackageTotal, 
Storage.Qty AS StorageQty, 
Storage.Qty - (Inv_rows.Qty * Pack_to_prod.Qty) AS NewStorageQty   
FROM Pack_to_prod,Inv_rows,Storage 
WHERE Inv_rows.ProdID = Pack_to_prod.ProdID 
AND Pack_to_prod.PackID = Storage.ItemID 
AND Inv_rows.InvID = 999
GROUP BY Inv_rows.ProdID, Pack_to_prod.PackID, Pack_to_prod.Qty, Storage.Qty, Inv_rows.Qty
这些结果是一个简单的列表,显示了为什么不能简单总结的问题:

PackageID   ProductID   ProductQty PackageQtyPerProduct PackageTotal StorageQty NewStorageQty  
A           100         2          2                    4            100        96
A           100         8          2                    16           100        84
B           100         2          1                    2            100        98
B           100         8          1                    8            100        92
A           101         2          1                    2            100        98
B           101         2          1                    2            100        98
A           102         2          3                    6            100        94
B           103         2          2                    4            100        96
B           103         8          2                    16           100        84
但不知道如何让它“一行一行”运行,这样每个“包装到生产数量”都可以单独处理


任何方向正确的帮助都将不胜感激。

这一点解释得很好。SQL代码是用户较早的编码约定(例如WHERE子句中的连接条件,而不是FROM),并且没有正确地组织到子查询中。所有的作品都在现场。我想这就是你要找的东西

with
inv_cte(ProdID, sum_qty) as (
    select ProdID, sum(Qty)
    from Inv_rows
    group by ProdID),
pack_cte(PackID, prod_qty) as (
    select pp.PackID, sum(pp.Qty*ic.sum_qty)
    from Pack_to_prod pp
         join inv_cte ic on pp.ProdID=ic.ProdID
    group by pp.PackID)
select s.ItemID, s.Qty-p.prod_qty as ResultQty
from Storage s
     join pack_cte p on s.ItemID=p.PackID;
更新语句

with
inv_cte(ProdID, sum_qty) as (
    select ProdID, sum(Qty)
    from Inv_rows
    group by ProdID),
pack_cte(PackID, prod_qty) as (
    select pp.PackID, sum(pp.Qty*ic.sum_qty)
    from Pack_to_prod pp
         join inv_cte ic on pp.ProdID=ic.ProdID
    group by pp.PackID)
update s
  set Qty=Qty-p.prod_qty
from Storage s
     join pack_cte p on s.ItemID=p.PackID;

这解释得很好。SQL代码是用户较早的编码约定(例如WHERE子句中的连接条件,而不是FROM),并且没有正确地组织到子查询中。所有的作品都在现场。我想这就是你要找的东西

with
inv_cte(ProdID, sum_qty) as (
    select ProdID, sum(Qty)
    from Inv_rows
    group by ProdID),
pack_cte(PackID, prod_qty) as (
    select pp.PackID, sum(pp.Qty*ic.sum_qty)
    from Pack_to_prod pp
         join inv_cte ic on pp.ProdID=ic.ProdID
    group by pp.PackID)
select s.ItemID, s.Qty-p.prod_qty as ResultQty
from Storage s
     join pack_cte p on s.ItemID=p.PackID;
更新语句

with
inv_cte(ProdID, sum_qty) as (
    select ProdID, sum(Qty)
    from Inv_rows
    group by ProdID),
pack_cte(PackID, prod_qty) as (
    select pp.PackID, sum(pp.Qty*ic.sum_qty)
    from Pack_to_prod pp
         join inv_cte ic on pp.ProdID=ic.ProdID
    group by pp.PackID)
update s
  set Qty=Qty-p.prod_qty
from Storage s
     join pack_cte p on s.ItemID=p.PackID;

这看起来像是一些聚合和联接。要获取值的更改,请执行以下操作:

select pp.packid, sum(p.qty * pp.qty) as new_qty
from (select ir.prodid, sum(qty) as qty
      from inv_rows ir
      group by ir.prodid
     ) p join
     Pack_to_prod pp
     on pp.prodid = p.prodid
group by pp.packid;
然后,您可以在
更新中使用此选项:

update s
    set s.qty = s.qty - pp.new_qty
    from storage s join
         (select pp.packid, sum(p.qty * pp.qty) as new_qty
          from (select ir.prodid, sum(qty) as qty
                from inv_rows ir
                group by ir.prodid
               ) p join
               Pack_to_prod pp
               on pp.prodid = p.prodid
          group by pp.packid
         ) pp
         on pp.packid = s.itemid;

这看起来像是一些聚合和联接。要获取值的更改,请执行以下操作:

select pp.packid, sum(p.qty * pp.qty) as new_qty
from (select ir.prodid, sum(qty) as qty
      from inv_rows ir
      group by ir.prodid
     ) p join
     Pack_to_prod pp
     on pp.prodid = p.prodid
group by pp.packid;
然后,您可以在
更新中使用此选项:

update s
    set s.qty = s.qty - pp.new_qty
    from storage s join
         (select pp.packid, sum(p.qty * pp.qty) as new_qty
          from (select ir.prodid, sum(qty) as qty
                from inv_rows ir
                group by ir.prodid
               ) p join
               Pack_to_prod pp
               on pp.prodid = p.prodid
          group by pp.packid
         ) pp
         on pp.packid = s.itemid;

谢谢我试图复制您的代码并运行它,但出现了一些错误。我还不明白它是如何工作的,所以我无法修复-我应该能够像上面写的那样运行它吗?问题列出了4个简化表。如果这些是a、b、c、d,则CTE inv\u CTE in旨在完成a。完成b&c的CTE包。完成d的最终选择。我将首先尝试谷歌CTE(公共表表达式)。我明白你的答复后再回来。错误为:Msg 8120,16级,状态1,第8行列“Pack_to_prod.Qty”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。Msg 8120,级别16,状态1,第8行列“inv_cte.sum_qty”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。是的,现在它给出了我要查找的结果。现在我只需要弄清楚如何把它放在update语句中。谢谢谢谢我试图复制您的代码并运行它,但出现了一些错误。我还不明白它是如何工作的,所以我无法修复-我应该能够像上面写的那样运行它吗?问题列出了4个简化表。如果这些是a、b、c、d,则CTE inv\u CTE in旨在完成a。完成b&c的CTE包。完成d的最终选择。我将首先尝试谷歌CTE(公共表表达式)。我明白你的答复后再回来。错误为:Msg 8120,16级,状态1,第8行列“Pack_to_prod.Qty”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。Msg 8120,级别16,状态1,第8行列“inv_cte.sum_qty”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。是的,现在它给出了我要查找的结果。现在我只需要弄清楚如何把它放在update语句中。谢谢