我有一个看起来像这样的表:
| 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 |
非常感谢你的帮助,我整天都在为此感到困惑!
答案 0 :(得分: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;
如果您的不同订单价值超过您的调色板,它会包裹。如果您想将订单绑定到一定数量的桶中以匹配您的调色板表计数,您也可以使用NTILE而不是DENSE_RANK。不同之处在于您是想将颜色循环到值还是将关闭值分组为颜色。