SQL のみを使用して最終結果を取得する場合は、PIVOT 関数を実装できます。動的 SQL バージョンを書き込もうとする前に、基本的なロジックを正しく理解できるように、必ず最初にハードコーディングされたバージョンを作成する必要があります。
types
列に変換する必要がある数が限られている場合は、次を使用できます。
select id, name, al, cl, sl
from
(
select e.id, e.name, lt.type, l.days
from tblEmp e
left outer join tblEmpLeaves l
on e.id = l.empId
left outer join tblLeaveType lt
on l.leaveId = lt.Id
) d
pivot
(
max(days)
for type in (al, cl, sl)
) piv
order by id;
SQL Fiddle with Demoを参照してください。
ただし、値の数が不明な場合は、動的 SQL を使用する必要があり、コードをストアド プロシージャに配置します。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(type)
from tblLeaveType
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, name,' + @cols + '
from
(
select e.id, e.name, lt.type, l.days
from tblEmp e
left outer join tblEmpLeaves l
on e.id = l.empId
left outer join tblLeaveType lt
on l.leaveId = lt.Id
) x
pivot
(
max(days)
for type in (' + @cols + ')
) p
order by id'
execute sp_executesql @query;
SQL Fiddle with Demoを参照してください。どちらも結果を返します:
| ID | NAME | AL | CL | SL |
|----|-------|--------|--------|--------|
| 1 | john | 5 | 2 | (null) |
| 2 | smith | 3 | (null) | (null) |
| 3 | jack | (null) | (null) | 4 |