0

次のようなテーブルがあります。

| ID |  Order  | ... | Colour  |
|  1 |    A    | ... |   xxx   |
|  2 |    A    | ... |   xxx   |
|  3 |    A    | ... |   xxx   |
|  4 |    B    | ... |   xxx   |
|  5 |    B    | ... |   xxx   |
|  6 |    C    | ... |   xxx   |
|  7 |    A    | ... |   xxx   |
|  8 |    B    | ... |   xxx   |
|  9 |    B    | ... |   xxx   |
| 10 |    B    | ... |   xxx   |

各注文に独自の色を割り当て、値を返す必要があります。残念ながら、注文名がどうなるかわからないので、単純な CASE ステートメントを実行できません。

私の質問は、結果が次のようになるように、これを行うための最良かつ最も効率的な方法は何でしょうか。

| ID |  Order  | ... | Colour   |
|  1 |    A    | ... |   Red    |
|  2 |    A    | ... |   Red    | 
|  3 |    A    | ... |   Red    |
|  4 |    B    | ... |   Blue   |
|  5 |    B    | ... |   Blue   |
|  6 |    C    | ... |   Green  |
|  7 |    A    | ... |   Red    |
|  8 |    B    | ... |   Blue   |
|  9 |    B    | ... |   Blue   |
| 10 |    B    | ... |   Blue    |

あなたの助けに感謝します、私はこれについて一日中困惑していました!

4

1 に答える 1

2

コメントに投稿された質問への回答がなければ、これがあなたの望むものかどうか確信が持てません。しかし、ここに行く...

DECLARE @paletteSize INT;

DECLARE @palette TABLE
    (    numVal INT IDENTITY(0, 1) PRIMARY KEY
        , colorVal VARCHAR(10)
    );

INSERT @palette
    ( colorVal )
VALUES 
    ( 'VIOLET' )
    ,( 'RED' )
    ,( 'BLUE' )
    ,( 'GREEN' )
    ,( 'ORANGE' )
    ,( 'YELLOW' );

SELECT @paletteSize = COUNT(*) FROM @palette;

DECLARE @source TABLE
    (    id INT IDENTITY(1, 1) PRIMARY KEY
        , orderVal CHAR(1)
    );
INSERT @source
    ( orderVal )
VALUES
    ( 'A' )
    ,( 'A' )
    ,( 'A' )
    ,( 'B' )
    ,( 'B' )
    ,( 'C' )
    ,( 'A' )
    ,( 'B' )
    ,( 'B' )
    ,( 'B');

SELECT
    sc.id
    , sc.orderVal
    , p.colorVal 
FROM 
    ( 
        SELECT 
            s.id
            , s.orderval
            , DENSE_RANK()
                OVER(    ORDER BY s.orderval ) % @paletteSize colorID
        FROM 
            @source s
    ) sc
JOIN 
    @palette p
    ON p.numVal = sc.colorID
ORDER BY 
    sc.id;

個別の Order 値が Palette を上回っている場合は、ラップ アラウンドします。パレット テーブルの数と一致するように注文をバケットのセット数にまとめたい場合は、DENSE_RANK の代わりに NTILE を使用することもできます。違いは、値に対して色を循環させるか、近い値をグループ化して色にするかです。

于 2012-12-06T18:44:13.750 に答える