更新除一条共享相同密钥的记录之外的所有记录?

问题描述 投票:0回答:1

我有这个表,其中很少有记录共享相同的 sales_key。我需要将金额列更新为 0,除了一条具有 sales_key 的记录。意味着对于每个 sales_key,只有一条记录应该有金额,其他记录需要为零。

我尝试过使用 min 但没有成功。

UPDATE #TEMPSALES2
SET NET_TTL = CASE 
                WHEN QTY = (SELECT MIN(QTY) FROM #TEMPSALES2 AS t2 WHERE t2.SALES_KEY = #TEMPSALES2.SALES_KEY) AND PRD_CD = (SELECT MIN(PRD_CD) FROM #TEMPSALES2 AS t2 WHERE t2.SALES_KEY = #TEMPSALES2.SALES_KEY)  THEN NET_TTL
                ELSE 0
               END,
NET_TTL_TAX = CASE 
                WHEN QTY = (SELECT MIN(QTY) FROM #TEMPSALES2 AS t2 WHERE t2.SALES_KEY = #TEMPSALES2.SALES_KEY) AND PRD_CD = (SELECT MIN(PRD_CD) FROM #TEMPSALES2 AS t2 WHERE t2.SALES_KEY = #TEMPSALES2.SALES_KEY) THEN NET_TTL_TAX
                ELSE 0
               END,
MKT_TAX_AMT = CASE 
                WHEN QTY = (SELECT MIN(QTY) FROM #TEMPSALES2 AS t2 WHERE t2.SALES_KEY = #TEMPSALES2.SALES_KEY) AND PRD_CD = (SELECT MIN(PRD_CD) FROM #TEMPSALES2 AS t2 WHERE t2.SALES_KEY = #TEMPSALES2.SALES_KEY) THEN MKT_TAX_AMT
                ELSE 0
               END
sql sql-server
1个回答
0
投票

如果我们对每个 Sale_Key 组中的记录进行编号,我们可以更新第一个记录之外的任何记录

CREATE TABLE TEMPSALES2 
(
    SALES_KEY   VARCHAR(512),
    NET_TTL smallmoney,
    NET_TTL_TAX smallmoney,
    MKT_TAX_AMT smallmoney,
    SEQ  INT
);

INSERT INTO TEMPSALES2 (SALES_KEY, NET_TTL, NET_TTL_TAX, MKT_TAX_AMT,SEQ) VALUES
    ('1', '1.12', '2.12', '3.12',1),
    ('1', '1.12', '2.12', '3.12',2),
    ('2', '4.12', '5.12', '6.12',3),
    ('3', '7.12', '8.12', '9.12',4);

SELECT * FROM  TEMPSALES2

--Add row number for Sales_Key column
SELECT *, ROW_NUMBER() OVER(PARTITION BY SALES_KEY ORDER BY SALES_KEY ASC) AS RowNum  FROM  TEMPSALES2

--Update all rows beyond the first one in each Sales Key group 
UPDATE TEMPSALES2
  SET NET_TTL =0, NET_TTL_TAX=0, MKT_TAX_AMT=0
WHERE SEQ in 
(
 SELECT SEQ FROM
  (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY SALES_KEY ORDER BY SALES_KEY ASC) AS RowNum  FROM  TEMPSALES2
  ) t
  WHERE ROWNUM > 1
)


SELECT * FROM  TEMPSALES2

小提琴

SALES_KEY NET_TTL NET_TTL_TAX MKT_TAX_AMT 序列
1 1.1200 2.1200 3.1200 1
1 0.0000 0.0000 0.0000 2
2 4.1200 5.1200 6.1200 3
3 7.1200 8.1200 9.1200 4
© www.soinside.com 2019 - 2024. All rights reserved.