2016-09-14 104 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