SQL为不同的值指定不同的颜色
我有一张这样的桌子:SQL为不同的值指定不同的颜色,sql,sql-server-2008,colors,Sql,Sql Server 2008,Colors,我有一张这样的桌子: | ID | Order | ... | Colour | | 1 | A | ... | xxx | | 2 | A | ... | xxx | | 3 | A | ... | xxx | | 4 | B | ... | xxx | | 5 | B | ... | xxx | | 6 | C | ... | xxx | | 7 |
| 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 |
| 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 |
我需要为每个订单指定自己的颜色并返回值。不幸的是,我不知道订单的名称,所以我不能做一个简单的案例陈述
我的问题是,做这件事的最好、最有效的方法是什么,这样结果看起来像这样:
| 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 |
| 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 |
非常感谢你的帮助,我一整天都在想这个问题 如果评论中没有问题的答案,我不能确定这是你想要的。但是,现在
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而不是密集排列。区别在于您是要在值上循环颜色,还是要将结束值分组为一种颜色。是否有保证最大数量的不同顺序值?如果您不知道每种颜色的
顺序
值应该是多少,您如何知道特定的顺序
值使用哪种颜色?对于ColorID
来说,更合适的公式可能是(densite_RANK()OVER(Order BY s.orderval)-1)%@paletesize+1
。否则,如果出现COUNT(DISTINCT@source.orderVal)
=COUNT(DISTINCT@palete.colorVal)
,表达式将返回0。我从0开始计算这一点。事实上,我忽略了这一点,抱歉。