创建一个兼容性矩阵

问题描述:

我如下得到的数据:创建一个兼容性矩阵

[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) 

如果我理解你的问题正确,你可以试试这个:

编辑更新到新的要求

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