0

行を列に設定する方法や、動的に生成された列にピボットを使用する方法がわかりません。tblEmp、tblLeaveType、tblEmpLeaves の 3 つのテーブルがあります。現在の結果セットは

EmpId Name Type Days
--------------------
 1    john  al   5
 1    john  cl   2
 2    smith al   3
 3    jack  sl   4

私はそれを正しい方法で手に入れたいと思っています。

EmpId Name    al     cl     sl
--------------------------------
 1    john    5      2     null
 2    smith   3     null   null
 3    jack    null  null   4

休暇の種類は動的に追加できます。ここでフィドルを確認してください - http://sqlfiddle.com/#!3/6ad02e/1 SQL Server 2008、c# を使用

4

1 に答える 1

2

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 |
于 2013-11-11T12:50:08.413 に答える