2011-09-06 51 views
-6

我有以下表:從其它行更新基於值的列

Id CategoryId Code Status 
================================= 
1 A100  0012 NULL 
2 A100  0012 NULL 
3 A100  0055 NULL 
4 A100  0012 NULL 
5 B201  1116 NULL 
6 B201  1116 NULL 
7 B201  1121 NULL 
8 B201  1024 NULL 

邏輯:1.對於相同類別ID,碼應該是相同的。 2.如果存在多個代碼,請考慮具有最低值的代碼。

期望的結果:

Id CategoryId Code Status 
================================= 
1 A100  0012 NULL 
2 A100  0012 NULL 
3 A100  0055 FAIL 
4 A100  0012 NULL 
5 B201  1116 FAIL 
6 B201  1116 FAIL 
7 B201  1121 FAIL 
8 B201  1024 NULL 

感謝

+0

你是什麼意思;它不允許你編寫代碼? –

+0

你想要的輸出是什麼? –

+2

@ Ben_53:「如果代碼對於相同的categoryid是不同的,否則爲NULL」 - 你怎麼知道哪個是「right」categoryid? –

回答

0

按照你編輯...

DECLARE @T TABLE 
(
ID INT, 
CategoryID CHAR(4), 
Code CHAR(4), 
Status CHAR(4) NULL 
) 
INSERT INTO @T (ID,CategoryID, Code) 
SELECT 1,'A100',0012 UNION ALL SELECT 2,'A100',0012 UNION ALL 
SELECT 3,'A100',0055 UNION ALL SELECT 4,'A100',0012 UNION ALL 
SELECT 5,'B201',1116 UNION ALL SELECT 6,'B201',1116 UNION ALL 
SELECT 7,'B201',1121 UNION ALL SELECT 8,'B201',1024; 

WITH T AS 
(
SELECT *, MIN(Code) OVER (PARTITION BY CategoryID) AS MinCode 
from @T 
) 
UPDATE T 
SET Status = 'FAIL' 
WHERE Code <> MinCode 

SELECT * 
FROM @T 

返回

ID   CategoryID Code Status 
----------- ---------- ---- ------ 
1   A100  12 NULL 
2   A100  12 NULL 
3   A100  55 FAIL 
4   A100  12 NULL 
5   B201  1116 FAIL 
6   B201  1116 FAIL 
7   B201  1121 FAIL 
8   B201  1024 NULL 
0

我要帶刺,但我真的認爲它應該是一個ne問題。

;WITH o AS 
(
    SELECT Id, CategoryId, Code, Status, 
    rn = ROW_NUMBER() OVER (PARTITION BY CategoryId ORDER BY Id) 
    FROM dbo.my_table 
), 
n AS 
(
    SELECT CategoryId, Code 
    FROM o WHERE rn = 1 
) 
UPDATE o 
    SET [Status] = 'FAILURE' 
    FROM o INNER JOIN n 
    ON o.CategoryId = n.CategoryId 
    AND o.Code <> n.Code 
    WHERE o.rn > 1;