将表转换为0和1的矩阵

时间:2013-07-03 07:35:51

标签: mysql sql oracle

我有一个主持人表和事件ID's Like

Hosts     |   Event_id
system1          1
System2          1
System1          2
System3          1
System2          2

现在我想将它们转换为像

这样的矩阵
             |  1    2    3    4    5    6    7    8    9 ....
---------------------------------------------------------------------
    System1  |  1    1    0    1    1    0    1    0    0 ....
    System2  |  1    1    1    1    1    0    1    0    0 ....
    System3  |  1    0    0    1    1    0    1    0    0 ....

如何在SQL中执行此操作?

2 个答案:

答案 0 :(得分:1)

你必须使用pivot来完成这项任务,但这不是动态的,你必须事先知道矩阵中的列。

以下查询适用于1到9之间的event_id,如果更大,则相应地将其添加到select和pivot子句中。

declare @t table 
(
 hosts VARCHAR(20), event_id int
)
insert into @t values ('system1','1')
insert into @t values ('System2','1')
insert into @t values ('System1','2')
insert into @t values ('System3','1')
insert into @t values ('System2','2')
insert into @t values ('System3','4')
select * from @t

Select Hosts,[1],[2],[3],[4],[5],[6],[7],[8],[9]
from 
(
select hosts,hosts as Hosts1,Event_id from @t 
) P
pivot 
(
count(Hosts1) for Event_id in ([1],[2],[3],[4],[5],[6],[7],[8],[9])
) as pvt

您可以从此处了解有关枢轴的更多信息http://msdn.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx

为上述sql实现动态数据透视

CREATE TABLE #t
(
 hosts VARCHAR(20), event_id int
)
insert into #t values ('system1','1')
insert into #t values ('System2','1')
insert into #t values ('System1','2')
insert into #t values ('System3','1')
insert into #t values ('System2','2')
insert into #t values ('System3','4')
select * from #t

declare @sql varchar(4000)
declare @ColumnList VARCHAR(2000)

select @columnList = stuff((select ',[' + CAST(event_id AS VARCHAR) + ']' from (select distinct event_id from #t) a1  for xml path('')),1,1,'') -- get the concatenated list of the event_id columns seperated by a comma.
select @columnList

SET @sql = 
'Select Hosts,' + @columnList + '
from 
(
select hosts,hosts as Hosts1,Event_id from #t 
) P
pivot 
(
count(Hosts1) for Event_id in (' + @columnList + ')
) as pvt'
exec (@sql)

答案 1 :(得分:0)

虽然 可以动态构建枢轴,但通常它更容易,更灵活地处理应用程序级别的显示逻辑(例如,使用简单的PHP循环)