Sql使用其他表的联接和更新表
我正试图通过销售产品中包含的包装来减少存储空间 产品可以有不同数量的相同包装,发票可以有不同数量的产品在单独的行中。应针对某些invoiceID执行操作 简化表格(摘要不是列,只是为了简化计算而添加): 我尝试的是: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.
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语句中。谢谢