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

個々のクエリを結合してみましたが、日付が多いため、結合するには時間がかかりすぎます。

効率的で、ビューまたは関数に格納できるようにするにはどうすればよいですか??

4

2 に答える 2

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;
}

これで、タブ区切りのテーブルができました。

于 2012-10-17T04:08:33.563 に答える
0

実際には、これはPIVOT関数で行うことができます。PIVOTを使用するには、静的または動的の2 つの方法があります。

静的ピボットでは、値をハードコーディングして列に変換します。

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
于 2012-10-17T10:23:34.823 に答える