2013-07-03 85 views
1

我的主機表和事件ID就像轉換表到0的矩陣和1

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中執行此操作?

+0

感謝您在R中發現,我想知道如何在SQL中完成。 – azzaxp

+1

偏題:[SQLFiddle](http://sqlfiddle.com/)的C盤上的磁盤空間不足... –

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

回答

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) 
+0

謝謝Surendra,但我不確定Event_id的。 – azzaxp

+1

然後你必須使用動態數據透視表,在這之前,請檢查系統中的上述查詢,並讓我知道它的工作原理,然後我們可以選擇動態數據透視解決方案。 – Surendra

+0

我沒有sql服務器,所以在Mysql中試用它對我有用。我有CSV格式的數據 – azzaxp

0

雖然可以動態地構建支點,通常這是容易得多並且更靈活地處理應用程序級別的顯示邏輯(例如,使用簡單的PHP循環)

+0

你能分享怎麼做嗎? – azzaxp