Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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_Sql Update - Fatal编程技术网

使用联接表的平均值进行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行)。因此,这两种方法都是正确的,这取决于您希望得到的结果。