2

SQL Server 2008 に次のようなテーブルがあります

  AMID                TierLevel
 --------            -------------
  999                 GOLD
  1000                SILVER   
  1000                GOLD
  1000                PLATINUM
  1000                BRONZE
  1001                GOLD
  1001                SILVER
  1002                SILVER
  1003                GOLD

今、このテーブルを次のように更新したい

  AMID                TierLevel
 --------            -------------
  999                 GOLD
  1000               PLATINUM  
  1000               PLATINUM
  1000               PLATINUM
  1000               PLATINUM
  1001                GOLD
  1001                GOLD
  1002                SILVER
  1003                GOLD

条件はこちら

  • 同じ AMID に対して一意の Tier 値が必要であり、Tier 値は次のように優先度ベースで選択する必要があります

    1. 白金
    2. ブロンズ
  • これは、Tier 値に最高のものがある場合は、それを選択することを意味します。2 番目の表に示したように、1000 がプラチナ、1001 がゴールドです。

これで私を助けてください

ありがとう、
ハリー

4

2 に答える 2

2
DECLARE @amid TABLE (Amid INT, TierLevel VARCHAR(20));

INSERT @amid VALUES
(999 ,'GOLD'),
(1000,'SILVER'), (1000,'GOLD'),   (1000,'PLATINUM'), (1000,'BRONZE'),
(1001,'GOLD'),   (1001,'SILVER'),
(1002,'SILVER'), (1003,'GOLD');

;WITH [priority](r, n) AS
(
    SELECT 1, 'PLATINUM'
    UNION ALL SELECT 2, 'GOLD'
    UNION ALL SELECT 3, 'SILVER'
    UNION ALL SELECT 4, 'BRONZE'
),
per_amid(amid, h) AS
(
    SELECT a.amid, MIN(p.r)
      FROM @amid AS a
      INNER JOIN [priority] AS p
      ON a.TierLevel = p.n
      GROUP BY a.amid
)
UPDATE a
  SET TierLevel = p.n
  FROM @amid AS a
  INNER JOIN per_amid AS pa
  ON a.Amid = pa.amid
  INNER JOIN [priority] AS p
  ON pa.h = p.r
  -- added where clause to address question brought up on other answer
  WHERE a.TierLevel <> p.n;

SELECT Amid, TierLevel FROM @amid;

結果:

Amid  TierLevel
----  ---------
999   GOLD
1000  PLATINUM
1000  PLATINUM
1000  PLATINUM
1000  PLATINUM
1001  GOLD
1001  GOLD
1002  SILVER
1003  GOLD
于 2012-05-21T15:33:49.747 に答える
1

これは、各Tierのランクを格納するための一時テーブルを使用して行います。

DECLARE @Rank TABLE (ID INT NOT NULL PRIMARY KEY, Name VARCHAR(10) NOT NULL)
INSERT @Rank VALUES (1, 'PLATINUM'), (2, 'GOLD'), (3, 'SILVER'), (4, 'BRONZE')

;WITH T AS
(   SELECT  AMID, TierLevel, MIN(ID) OVER(PARTITION BY AMID) [MinID]
    FROM    #T
            INNER JOIN @Rank
                ON Name = TierLevel
)
UPDATE  T
SET     TierLevel = Name
FROM    T
        INNER JOIN @Rank
            ON ID = MinID
WHERE   TierLevel <> Name

これは、次のサンプルデータを使用して行われました。

CREATE TABLE #T (AMID INT, TierLevel VARCHAR(10))
INSERT #T VALUES 
    (999, 'GOLD'), 
    (1000, 'SILVER'), 
    (1000, 'GOLD'), 
    (1000, 'PLATINUM'), 
    (1000, 'BRONZE'),
    (1001, 'GOLD'),
    (1001, 'SILVER'),
    (1002, 'SILVER'),
    (1003, 'GOLD')
于 2012-05-21T15:25:03.080 に答える