2013-04-23 79 views
1

我如下得到的數據:創建一個兼容性矩陣

[attribute] [value] 
foo yellow 
foo green 
foo red 
foo blue 
foo orange 
foo cyan 
foo magenta 
foo white 
foo brown 
foo purple 

provided in this fiddle

我想數據轉換爲一種框架的一個兼容性列表,其內容應當類似於(COLS和行是基於屬性值):

 yellow green red blue orange cyan magenta white brown purple 
yellow x 
green   x 
red     x 
blue      x 
orange       x 
cyan         x 
magenta          x 
white            x 
brown              x 
purple               x 

同種屬性應自動填充x的,所有其它的組合是由用戶設置的稍後的。由於attributevalues的數量可能不同,所以如果轉換是動態完成的,那將是很好的。

我用pivot/unpivot做了一些鏡頭,但只改變了cols ans行 - 所以只用了一半(或四分之一))。

任何幫助或提示,感謝!

編輯:我更改了演示數據的屬性值以便更好地理解。顏色值之前是數字。

編輯2:根據Stephan的更新答案和所提到的動態獲取結果的目的,我添加了以下示例查詢。也許有人可以使用它,有相同的需要。 #數據是提供基礎數據的臨時表。

DECLARE  @SQL VARCHAR(MAX); 
SET   @SQL = 'SELECT ' + '?placeholder?' + ' as name, ' 
SELECT @SQL = @SQL + case when row_number() over (order by rand()) > 1 then ',' else '' end + 'case value when ''' + cast(d.value as nvarchar) + ''' then 1 else 0 end as "' + cast(d.value as nvarchar) + '"' from #data as d; 
select @sql = @sql + ' from #data;' 
set @SQL = replace(@sql, '?placeholder?', 'value'); 
--select @SQL; 
exec (@sql) 

回答

0

如果我理解你的問題正確,你可以試試這個:

編輯更新到新的要求

CREATE TABLE `test_matrix_colors` (
    `color` varchar(255) NOT NULL 
); 

INSERT INTO `test_matrix_colors` (`color`) VALUES 
('yellow'), 
('green'), 
('red'), 
('blue'), 
('orange'), 
('cyan'), 
('magenta'), 
('white'), 
('brown'), 
('purple'); 


SELECT 
    color, 
    IF(color='yellow',1,0) as yellow, 
    IF(color='green',1,0) as green, 
    IF(color='red',1,0) as red, 
    IF(color='blue',1,0) as blue, 
    IF(color='orange',1,0) as orange, 
    IF(color='cyan',1,0) as cyan, 
    IF(color='magenta',1,0) as magenta, 
    IF(color='white',1,0) as white, 
    IF(color='brown',1,0) as brown, 
    IF(color='purple',1,0) as purple 
FROM 
    test_matrix_colors 
WHERE 1 

結果我在本地獲得:

enter image description here

Afte [R,你可以得到你需要的任何組合......例如藍色,橙色:

SELECT 
    orange as blue_orange 
FROM (
    SELECT 
     color, 
     IF(color='yellow',1,0) as yellow, 
     IF(color='green',1,0) as green, 
     IF(color='red',1,0) as red, 
     IF(color='blue',1,0) as blue, 
     IF(color='orange',1,0) as orange, 
     IF(color='cyan',1,0) as cyan, 
     IF(color='magenta',1,0) as magenta, 
     IF(color='white',1,0) as white, 
     IF(color='brown',1,0) as brown, 
     IF(color='purple',1,0) as purple 
    FROM 
     test_matrix_colors 
    WHERE 1 
) as tmp 
WHERE 
    color = 'blue' 
+0

想法不錯,但:'IF(,,)'不能在SQL 2008年工作,我把它改爲'情況.. when'。此外,「價值」不包括在估計數據中顯示的第一列中 - 可能是誤解,因爲演示數據中的「價值」被設置爲1到10,這也可能是rownumber;) – Nico 2013-04-23 11:39:04

+0

對不起'IF'語句我在mysql中編寫了查詢,因爲這是我已經安裝的,你能準確地知道你有什麼數據或至少有一些與之相近的數據嗎? – Stephan 2013-04-23 12:55:29

+0

我不完全明白你的問題! 「演示數據」在鏈接的SQL小提琴中提供。估計結果顯示在原來的帖子..! – Nico 2013-04-23 14:18:06