创建一个兼容性矩阵
问题描述:
我如下得到的数据:创建一个兼容性矩阵
[attribute] [value]
foo yellow
foo green
foo red
foo blue
foo orange
foo cyan
foo magenta
foo white
foo brown
foo purple
我想数据转换为一种框架的一个兼容性列表,其内容应当类似于(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
的,所有其它的组合是由用户设置的稍后的。由于attribute
的values
的数量可能不同,所以如果转换是动态完成的,那将是很好的。
我用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
结果我在本地获得:
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'
想法不错,但:'IF(,,)'不能在SQL 2008年工作,我把它改为'情况.. when'。此外,“价值”不包括在估计数据中显示的第一列中 - 可能是误解,因为演示数据中的“价值”被设置为1到10,这也可能是rownumber;) – Nico 2013-04-23 11:39:04
对不起'IF'语句我在mysql中编写了查询,因为这是我已经安装的,你能准确地知道你有什么数据或至少有一些与之相近的数据吗? – Stephan 2013-04-23 12:55:29
我不完全明白你的问题! “演示数据”在链接的SQL小提琴中提供。估计结果显示在原来的帖子..! – Nico 2013-04-23 14:18:06