创建兼容性矩阵

时间:2013-04-23 09:03:50

标签: sql-server-2008 tsql

我的数据如下:

[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和row基于属性值):

        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,所有其他组合将由用户稍后设置。由于valuesattribute的数量可能不同,因此如果转换是动态完成的,那就太好了。

我使用pivot / unpivot进行了一些镜头但只改变了cols和行 - 所以只走了一半(或四分之一;))。

任何帮助或提示表示赞赏!

编辑:我已更改了演示数据的属性值,以便更好地理解。颜色值以前是数字。

Edit2 :根据Stephan的更新答案以及提到的动态获取结果的目标,我添加了以下示例查询。也许有人可以使用它,有相同的需求。 #data是提供基础数据的临时表。

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 )

1 个答案:

答案 0 :(得分: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

之后,您可以获得所需的任何组合......例如蓝橙色:

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'