使用联接表的平均值进行SQL更新
我试图通过计算订单日期和库存接收日期之间的差异来更新表中的供应商提前期使用联接表的平均值进行SQL更新,sql,sql-server,sql-update,Sql,Sql Server,Sql Update,我试图通过计算订单日期和库存接收日期之间的差异来更新表中的供应商提前期 UPDATE cr_accs SET cr_accs.leadtime = Avg(Datediff(day, purchord_hdr.orderdate, stock_trans.transdate)) FROM stock_items INNER JOIN stock_trans O
UPDATE cr_accs
SET cr_accs.leadtime = Avg(Datediff(day, purchord_hdr.orderdate,
stock_trans.transdate))
FROM stock_items
INNER JOIN stock_trans
ON stock_trans.stockcode = stock_items.stockcode
INNER JOIN purchord_hdr
ON purchord_hdr.seqno = stock_trans.ref1
WHERE cr_accs.accno = purchord_hdr.accno
AND stock_trans.location = 1
AND stock_trans.ref2 = 'RECEIPT'
AND purchord_hdr.orderdate >= Dateadd(day, Datediff(day, 0, Getdate()),-730)
AND stock_items.isactive = 'Y'
AND stock_items.bincode NOT IN ( 'OIO', 'CON' )
然而,我得到了一个错误
聚合不能出现在UPDATE语句的集合列表中
我见过其他解决方案,您可以将查询更改为:
UPDATE cr_accs
SET cr_accs.leadtime = h.calc_lead_time
FROM (SELECT AVG(DATEDIFF(day, purchord_hdr.orderdate, stock_trans.transdate)) AS calc_lead_time
FROM stock_items
INNER JOIN stock_trans
ON stock_trans.stockcode = stock_items.stockcode
INNER JOIN purchord_hdr
ON purchord_hdr.seqno = stock_trans.ref1
INNER JOIN cr_accs
ON cr_accs.accno = purchord_hdr.accno
WHERE cr_accs.accno = purchord_hdr.accno
AND stock_trans.location = 1
AND stock_trans.ref2 = 'RECEIPT'
AND purchord_hdr.orderdate >= Dateadd(day, Datediff(day, 0, Getdate()),-730)
AND stock_items.isactive = 'Y'
AND stock_items.bincode NOT IN ( 'OIO', 'CON' ) ) h
然而,这不是我的解决方案,因为它没有定义每个供应商的交付周期是唯一的。。。
指出每个供应商由cr_accs.accno标识可能会有所帮助
有什么想法吗?尝试将表连接到查询:
UPDATE c
SET c.leadtime = h.calc_lead_time
FROM cr_accs c
INNER JOIN (
SELECT purchord_hdr.accno,
AVG(DATEDIFF(day, purchord_hdr.orderdate, stock_trans.transdate)) AS calc_lead_time
FROM stock_items
INNER JOIN stock_trans ON stock_trans.stockcode = stock_items.stockcode
INNER JOIN purchord_hdr ON purchord_hdr.seqno = stock_trans.ref1
WHERE stock_trans.location = 1
AND stock_trans.ref2 = 'RECEIPT'
AND purchord_hdr.orderdate >= Dateadd(day, Datediff(day, 0, Getdate()),-730)
AND stock_items.isactive = 'Y'
AND stock_items.bincode NOT IN ('OIO', 'CON')
GROUP BY purchord_hdr.accno
) h ON h.accno = c.accno
我假设(根据您的代码和错误消息)您正在使用SQL Server。您也可以使用相关子查询执行您想要执行的操作,这可能是您尝试执行的操作:
UPDATE cr_accs
SET cr_accs.leadtime =
(SELECT AVG(DATEDIFF(day, p.orderdate, st.transdate)) AS calc_lead_time
FROM stock_items si JOIN
stock_trans st
ON st.stockcode = si.stockcode JOIN
purchord_hdr p
ON p.seqno = st.ref1
WHERE cr_accs.accno = p.accno AND
st.location = 1 AND
st.ref2 = 'RECEIPT' AND
p.orderdate >= Dateadd(day, Datediff(day, 0, Getdate()), -730) AND
si.isactive = 'Y' AND
si.bincode NOT IN ( 'OIO', 'CON' )
);
我引入了表别名,因此查询更易于编写和读取
SQL Server还使您能够使用APPLY
:
UPDATE a
SET a.leadtime = p.calc_lead_time
FROM cr_accs a CROSS APPLY
(SELECT AVG(DATEDIFF(day, p.orderdate, st.transdate)) AS calc_lead_time
FROM stock_items si JOIN
stock_trans st
ON st.stockcode = si.stockcode JOIN
purchord_hdr p
ON p.seqno = st.ref1
WHERE a.accno = p.accno AND
st.location = 1 AND
st.ref2 = 'RECEIPT' AND
p.orderdate >= Dateadd(day, Datediff(day, 0, Getdate()), -730) AND
si.isactive = 'Y' AND
si.bincode NOT IN ( 'OIO', 'CON' )
) p;
您使用的是哪种DBMS产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称(在标准SQL中,UPDATE命令没有
FROM
子句)。感谢Gordon Linoff-这确实有效谢谢:-)您的回答会更新表中的每个供应商交付周期,无论是否在两年内进行了任何采购(>=730天)-如果没有采购,则交付周期为空…(正确)@forpas解决方案也可以工作-但是只更新有采购的供应商(两个查询之间受影响的902行与受影响的235行)。因此,这两种方法都是正确的,这取决于您希望得到的结果。