2016-09-14 102 views
0

我很感激我的代碼任何幫助,我不斷收到一個錯誤SQL UPDATE錯誤

SQL命令無法正常從蟾蜍結束」。

UPDATE GS_MRC_EXISTING GME 
SET GME.GROSS_LAST = STC.SALES 
WITH STC AS 
( 
SELECT DISTINCT (DSF.SOLD_TO_CUSTOMER_KEY) AS CUSTS, 
      SUM (CASE WHEN DSF.NET_PRICE >=0 THEN NET_PRICE ELSE 0 END ) AS SALES, 
      SUM (CASE WHEN DSF.NET_PRICE <=0 THEN NET_PRICE ELSE 0 END ) AS DISCOUNT 
FROM DAILY_SALES_FACT DSF, 
      MATERIAL_DIM MD  
WHERE 
DSF.SALES_DOC_TYPE_SID = '10' 
AND DSF.MATERIAL_SID = MD.MATERIAL_SID 
AND DSF.NET_PRICE <> 0 
AND DSF.TPNM_ACTUAL_START_DATE_KEY BETWEEN '20160101' AND '20160731' 
GROUP BY DSF.SOLD_TO_CUSTOMER_KEY 
) 
WHERE GME.CUST_CODE = STC.CUSTS; 
+3

您使用的是什麼RDBMS? –

回答

0

也許你應該刪除後 「UPDATE」 命令 「和」 部分。如果按字段對結果進行分組,則不能在該字段上使用「distinct」。像這樣:

WITH STC AS 
(
    SELECT DSF.SOLD_TO_CUSTOMER_KEY AS CUSTS, 
     SUM (CASE WHEN DSF.NET_PRICE >=0 THEN NET_PRICE ELSE 0 END ) AS SALES, 
     SUM (CASE WHEN DSF.NET_PRICE <=0 THEN NET_PRICE ELSE 0 END ) AS DISCOUNT 
    FROM DAILY_SALES_FACT DSF, 
     MATERIAL_DIM MD 
    WHERE 
     DSF.SALES_DOC_TYPE_SID = '10' 
     AND DSF.MATERIAL_SID = MD.MATERIAL_SID 
     AND DSF.NET_PRICE <> 0 
     AND DSF.TPNM_ACTUAL_START_DATE_KEY BETWEEN '20160101' AND '20160731' 
    GROUP BY DSF.SOLD_TO_CUSTOMER_KEY 
) 
UPDATE GS_MRC_EXISTING SET GROSS_LAST = STC.SALES WHERE CUST_CODE = STC.CUSTS; 
+0

當我這樣做,它想要一個SELECT語句? – Gavin

+0

謝謝大家的幫助,我翻了一下,讓它工作... UPDATE table x SET x.field =(SELECT q.field FROM query q WHERE q.f2 = x.f2) - 將此關聯以獲得單行返回 WHERE x.f3 = value - 限制更新的行號 ; – Gavin

1

Toad建議Oracle。這表明,子查詢對於這樣的update(或merge):

UPDATE GS_MRC_EXISTING GME 
    SET GME.GROSS_LAST = (SELECT SUM(CASE WHEN DSF.NET_PRICE >= 0 THEN NET_PRICE ELSE 0 END ) AS SALES 
          FROM DAILY_SALES_FACT DSF JOIN 
           MATERIAL_DIM MD 
           ON DSF.MATERIAL_SID = MD.MATERIAL_SID 
          WHERE DSF.SALES_DOC_TYPE_SID = '10' AND 
           DSF.NET_PRICE <> 0 AND 
           DSF.TPNM_ACTUAL_START_DATE_KEY BETWEEN '20160101' AND '20160731' AND 
           DSF.SOLD_TO_CUSTOMER_KEY = GME.CUST_CODE 
         ); 

注意:這將更新所有的行,即使是那些不匹配。您可能想要限制:

UPDATE GS_MRC_EXISTING GME 
    SET GME.GROSS_LAST = (SELECT SUM(CASE WHEN DSF.NET_PRICE >= 0 THEN NET_PRICE ELSE 0 END ) AS SALES 
          FROM DAILY_SALES_FACT DSF JOIN 
           MATERIAL_DIM MD 
           ON DSF.MATERIAL_SID = MD.MATERIAL_SID 
          WHERE DSF.SALES_DOC_TYPE_SID = '10' AND 
           DSF.NET_PRICE <> 0 AND 
           DSF.TPNM_ACTUAL_START_DATE_KEY BETWEEN '20160101' AND '20160731' AND 
           DSF.SOLD_TO_CUSTOMER_KEY = GME.CUST_CODE 
         ) 
WHERE EXISTS (SELECT 1 
       FROM DAILY_SALES_FACT DSF JOIN 
        MATERIAL_DIM MD 
        ON DSF.MATERIAL_SID = MD.MATERIAL_SID 
       WHERE DSF.SALES_DOC_TYPE_SID = '10' AND 
        DSF.NET_PRICE <> 0 AND 
        DSF.TPNM_ACTUAL_START_DATE_KEY BETWEEN '20160101' AND '20160731' AND 
        DSF.SOLD_TO_CUSTOMER_KEY = GME.CUST_CODE 
      ); 
+0

謝謝戈登,我會放棄這一點。感謝你的幫助。 – Gavin