2012-09-01 51 views
0

我有一個查詢返回一些字符串值。我需要爲每個唯一的值分配一個顏色,但是我無法知道將會有多少個唯一值或按什麼順序排列。下面是該查詢返回的那一刻:SQL分配/生成數據的唯一顏色

| ID | Value | Colour | 
     1   XF452   ? 
     2   ALL1F5   ? 
     3   NULL   ? 
     1   XF452 
     2   BD4F 
     3   NULL 
     1   XF452 
     2   XF452 
     3   XF452 

我想一個顏色分配給每個不同的值,以便它會看起來像這樣:

| ID | Value | Colour | 
     1   XF452  #880010 
     2   ALL1F5  #FF0000 
     3   NULL   #8C8C8C 
     1   XF452  #880010 
     2   BD4F   #002871 
     3   NULL   #8C8C8C 
     1   XF452  #880010 
     2   XF452  #880010 
     3   XF452  #880010 

我半實現了這個已經通過獲取Value列的unicode值並將「#」附加到開頭,但顏色變化非常渺茫 - 主要是相同顏色的不同陰影。有沒有人有更好的想法?

回答

1

您可以使用子查詢來獲取每個值併爲其分配一個顏色(使用你選擇的任何一種方法)使用:

SELECT value, getMyColour() AS colour FROM table GROUP BY value; 

然後,您可以加入這個子查詢到您的原始表得到的值了:

SELECT table.id, table.value, subq.colour 
FROM table, 
    (SELECT value, getMyColour() AS colour FROM table GROUP BY value) subq 
WHERE table.value = subq.value 
0

我的建議是,

獲取從表中不同的值到臨時表。

create table #temp(value varchar(10),color_code varchar(100)) 

insert into #temp 
select distinct value,getcolor from yourtable 

現在你只需要連接表這樣你可以做

update u SET Color=t.color_code from yourtable u join #temp t 
on u.value=t.value 
0

一種方式是通過使用NEWID()。下面是在INFORMATION_SCHEMA.COLUMNS隨機分配4字節的值,以表的示例:

select max(cast(NEWID() as BINARY(4))) over (partition by table_name), table_name 
from INFORMATION_SCHEMA.COLUMNS 

cast(NEWID() as BINARY(4))表達產生一個隨機4字節的值。 max() over (partition . . .)爲具有相同table_name的所有內容(在本例中)分配相同的值。你可以使用下面的表達式:

select max(cast(NEWID() as BINARY(4))) over (partition by value) 

順便說一句,如果你想畢業了顏色,而不是隨機的顏色,我會考慮這樣的:

select cast((dense_rank(value) over (partition by value))/(select count(distinct value)*1.0 from table)*power(2.0, 32) as binary(4)) 
0
SET [Color] = '#' + CONVERT(VARCHAR(max), CRYPT_GEN_RANDOM(3), 2)