SQL Обновление с AVG объединенных таблиц - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь обновить время выполнения заказа в таблице, вычисляя разницу между датой заказа и датой поступления на склад ....

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

Есть идеи, пожалуйста?

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Вы также можете делать то, что хотите, используя коррелированный подзапрос, который может быть тем, что вы пытались сделать:

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 Сервер также дает вам возможность express, используя 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;
1 голос
/ 15 февраля 2020

Попробуйте соединить таблицу с запросом:

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 Сервер.

...