[英]Transposing Table
我到處都是,沒有發現任何有用的東西。
我有一張桌子,為員工提供了幫助。
該表如下所示:
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
我嘗試了單個查詢並加入了它們,但是由於它們的日期很多,所以這樣做需要太多時間。
我怎樣才能做到高效並且可以將其存儲到視圖或函數中?
以服務器端語言(如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;
}
您現在有了一個制表符分隔的表。
實際上,這可以通過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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.