2012-10-17 25 views
1

我到處尋找並沒有發現任何有用的東西。移調錶

我有一個表爲員工的捕獲幫助。

,看起來像這樣的表:

ID | DATE  | ATTENDANCE 
________________ 
2524 | 20121001 | ASISTANCE 
2525 | 20121001 | ABSCENCE 
2526 | 20121001 | ASISTANCE 
2527 | 20121001 | ASISTANCE 
2524 | 20121002 | ASISTANCE 
2525 | 20121002 | ABSCENCE 
2526 | 20121002 | ASISTANCE 
2527 | 20121002 | ASISTANCE 
2524 | 20121003 | ASISTANCE 
2525 | 20121003 | DAY OFF 
2526 | 20121003 | DAY OFF 
2527 | 20121003 | ASISTANCE 

而且我想返回一個表的查詢,將是這樣的:

ID | 20121001 | 20121002 | 20121003 
________________ 
2524 | ASISTANCE | ASISTANCE | ASISTANCE 
2525 | ABSCENCE | ABSCENCE | DAY OFF 
2526 | ASISTANCE | ASISTANCE | ASISTANCE 
2527 | ASISTANCE | ASISTANCE | DAY OFF 

我試過單獨querys,並加入他們,但由於他們需要很多時間才能做到這一點。

我該怎麼做,它是有效的,可以存儲到一個視圖或功能?

+3

你的*大寫鎖定*鍵顯示爲m alfunctioning。 – nneonneo

+0

當你在這裏時,請學習如何拼寫單詞「援助」。 – 2012-10-17 04:52:12

+0

你使用了什麼數據庫?如果您使用Microsoft SQL Server,則可以使用[PIVOT](http://msdn.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx)。這不是標準的SQL,其他數據庫可能也可能不支持類似的東西。 –

回答

1

獲取數據並使用PHP等服務器端語言處理數據會更容易。那麼這將是一件小事,以建立數組:

$entry[$id][$date] = $status; 

然後:

echo "ID"; 
foreach(array_keys(array_values($entry)[0]) as $date) { 
    // requires some temporary variables in PHP before 5.4 
    echo "\t".$date; 
} 
foreach($entry as $id=>$days) { 
    echo "\n".$id; 
    foreach($days as $day) echo "\t".$day; 
} 

您現在有一個製表符分隔表。

0

實際上,這可以通過PIVOT函數完成。有兩種方法可以使用PIVOT,無論是靜態還是動態。

靜態支點,你會硬編碼變成列中的值:

create table tablea 
(
    id int, 
    dt datetime, 
    attendance varchar(20) 
); 

insert into tablea values 
(2524 , '20121001' , 'ASISTANCE'), 
(2525 , '20121001' , 'ABSCENCE'), 
(2526 , '20121001' , 'ASISTANCE'), 
(2527 , '20121001' , 'ASISTANCE'), 
(2524 , '20121002' , 'ASISTANCE'), 
(2525 , '20121002' , 'ABSCENCE'), 
(2526 , '20121002' , 'ASISTANCE'), 
(2527 , '20121002' , 'ASISTANCE'), 
(2524 , '20121003' , 'ASISTANCE'), 
(2525 , '20121003' , 'DAY OFF'), 
(2526 , '20121003' , 'DAY OFF'), 
(2527 , '20121003' , 'ASISTANCE'); 

select * 
from 
(
    select id, dt, attendance 
    from tablea 
) x 
pivot 
(
    max(attendance) 
    for dt in ([2012-10-01], [2012-10-02], [2012-10-03]) 
) p; 

動態PIVOT將得到的值在運行時的名單,將更加靈活,如果該列表是不斷變化的:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(10), dt, 120)) 
        from tablea 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, ' + @cols + ' from 
      (
       select id, dt, attendance 
       from tablea 
      ) x 
      pivot 
      (
       max(attendance) 
       for dt in (' + @cols + ') 
      ) p ' 

execute(@query) 

兩者都會產生相同的結果:

id | 2012-10-01 | 2012-10-02 | 2012-10-03 
------------------------------------------- 
2524 | ASISTANCE | ASISTANCE | ASISTANCE 
2525 | ABSCENCE | ABSCENCE | DAY OFF 
2526 | ASISTANCE | ASISTANCE | DAY OFF 
2527 | ASISTANCE | ASISTANCE | ASISTANCE