2013-04-05 79 views
0

我試圖從MS SQL Server 2005上的一個表創建一個視圖,使用它的一些數據來填充視圖的列...一個簡單的例子將表保持階段記錄的用戶已經解鎖,這樣的:SQL-Server使用從表中取得的列創建視圖

UserID | Stage | Date 

1 | 1 | 1-1-2013 
1 | 2 | 2-1-2013 
2 | 1 | 1-1-2013 
1 | 3 | 5-1-2013 
2 | 2 | 3-1-2013 
3 | 1 | 6-1-2013 
3 | 2 | 8-1-2013 
1 | 4 | 10-1-2013 
3 | 3 | 12-1-2013 

而且我正在尋找像一個視圖(如果有4個階段可獲取):

UserID | Stage 1 | Stage 2 | Stage 3 | Stage 4 

1 | 1-1-2013 | 2-1-2013 | 5-1-2013 | 10-1-2013 
2 | 1-1-2013 | 3-1-2013 | | 
3 | 6-1-2013 | 8-1-2013 | 12-1-2013 | 

的階段是新視圖的列。

我在Access上做過類似的事情,但不知道它是否可以在SQL Server上使用。

回答

4

有幾種方法,你可以支點 SQL Server中的數據將數據從行轉換爲列。

您可以用CASE表達應用聚合函數:

select userid, 
    max(case when stage=1 then date end) Stage1, 
    max(case when stage=2 then date end) Stage2, 
    max(case when stage=3 then date end) Stage3, 
    max(case when stage=4 then date end) Stage4 
from dbo.yourtable 
group by userid; 

SQL Fiddle with Demo

或者你可以使用PIVOT功能:

select userid, Stage1, Stage2, Stage3, Stage4 
from 
(
    select userid, 'Stage'+cast(stage as varchar(10)) Stage, date 
    from dbo.yourtable 
) d 
pivot 
(
    max(date) 
    for stage in (Stage1, Stage2, Stage3, Stage4) 
) piv; 

SQL Fiddle with Demo。從兩者的結果將是:

| USERID |  STAGE1 |  STAGE2 |  STAGE3 |  STAGE4 | 
-------------------------------------------------------------- 
|  1 | 2013-01-01 | 2013-02-01 | 2013-05-01 | 2013-10-01 | 
|  2 | 2013-01-01 | 2013-03-01 |  (null) |  (null) | 
|  3 | 2013-06-01 | 2013-08-01 | 2013-12-01 |  (null) | 
+0

令人印象深刻,感謝您的解決方案和SQL小提琴,我不知道那一頁。 – Pete 2013-04-05 11:47:06

+0

@Pete歡迎您! SQL Fiddle很棒,它是由StackOverflow用戶編寫的。 – Taryn 2013-04-05 11:48:41