题
我有一个表,它类似于以下以下内容:
id | cat | one_above | top_level |
0 'printers' 'hardware' 'computers'
我希望能够编写一个查询,请不使用工会后,将返回我调换此表的列到行的结果集。这意味着,是我想得到的结果是:
id | cat |
0 'printers'
0 'hardware'
0 'computers'
这是可能在MySQL?我不能下降到应用层和执行这一点,因为我喂它们转变成能够将指数基于ID的搜索引擎。其他各种DBMS有类似PIVOT和UNPIVOT。我将不胜感激任何见解的东西,我错过了。
马哈茂德
P.S。
我在考虑数据库作为最后的选择重新正常化,因为这不会是一个简单的任务。
谢谢!
解决方案
我得到这个出书 SQL 的艺术,页面284-286:
让我们假设你的表名是foo
。
首先,创建一个表称为pivot
:
CREATE Table pivot (
count int
);
插入到该表中的许多行,因为有要在foo
转动列。既然你有foo
三列要转动,数据透视表中创建三行:
insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);
现在做的笛卡尔foo
和pivot
之间加入,使用CASE
基于计数来选择正确的列:
SELECT foo.id, Case pivot.count
When 1 Then cat
When 2 Then one_above
When 3 Then top_level
End Case
FROM foo JOIN pivot;
这应该给你你想要的东西。
不隶属于 StackOverflow