0

私は4つのテーブル tblEmployeesを持っています

従業員ID名    
1 ザヒーズ
2 ニゴン
3 ジミアン
4 アッシュ
5 ダニ

tblメンバー

会員番号名
1 サリーム
2 ジャミル
3 ジャジ
4フナ
5 ジョン
6 モウム
参照セッション

セッション ID 開始時刻 終了時刻
1 0701 0730
2 0731 0800
3 0801 0830
4 0831 0900
5 0901 0930
6 0931 1000
7 1001 1030
8 1031 1100
9 1101 1130
10 1131 1200
11 1201 1230
12 1231 1300
13 1301 1330
14 1331 1400
15 1401 1430
16 1431 1500
17 1501 1530
18 1531 1600
19 1601 1630
20 1631 1700
21 1701 1730
22 1731 1800
23 1801 1830
24 1831 1900
25 1901 1930
26 1931 2000
27 2001 2030
28 2031 2100

tblBookSession

BookingID SessionID EmployeeID MemberNo SessionDate
1 15 2 3 2012-09-30
2 16 2 3 2012-09-30
3 1 3 4 2012-10-03
4 2 3 4 2012-10-03
5 3 3 4 2012-10-03
6 4 3 4 2012-10-03

特定の日付に対して上記のフォームになるt-sqlクエリを探しています

ジムでトレーナーの時間帯を実際に予約し、日付ごとのレポートの形式で表示します

4

1 に答える 1

3

を実行する必要がありますPIVOT。PIVOT でこれを行うには 2 つの方法があります。変換する列をコーディングする静的ピボットか、実行時に列を決定する動的ピボットのいずれかです。

静的ピボットでは、値をハードコードする必要があります。

select name,
   IsNull([701-730], '') [701-730],
   IsNull([731-800], '') [731-800],
   IsNull([801-830], '') [801-830],
   IsNull([831-900], '') [831-900]
from
(
  select e.name,
    cast(e.starttime as varchar(10))+'-'
      +cast(e.endtime as varchar(10)) Session,
    m.FirstName
  from
  (
    select *
    from tblEmployees e
    cross apply RefSessions
  ) e
  left join tblBookSession b
    on e.EmployeeID = b.EmployeeID
    and e.sessionid = b.sessionid
  left join tblMembers m
    on b.MemberNo = m.MemberNo
) x
pivot
(
  max(FirstName)
  for session in ([701-730], [731-800], [801-830], [831-900]) -- additional sessions here
)p

デモで SQL Fiddle を参照してください

列に変換する値が多数ある場合、または値の数が不明な場合は、次の動的 SQL バージョンを使用することをお勧めしますPIVOT

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

select @cols = STUFF((SELECT ',' 
                      + QUOTENAME(cast(starttime as varchar(10))
                                  +'-'+cast(endtime as varchar(10))) 
                    from RefSessions
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')



select @colsPivot = STUFF((SELECT ', IsNull(' 
                      + QUOTENAME(cast(starttime as varchar(10))
                          +'-'+cast(endtime as varchar(10))) +', '''') as [' +
                           cast(starttime as varchar(10))
                                  +'-'+cast(endtime as varchar(10)) + ']'
                    from RefSessions
                    group by SessionID, starttime, endtime
                    order by SessionID 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')



set @query = 'SELECT name, ' + @colsPivot + ' from 
             (
                  select e.name,
                    cast(starttime as varchar(10))+''-''
                      +cast(endtime as varchar(10)) Session,
                    m.FirstName
                  from
                  (
                    select *
                    from tblEmployees e
                    cross apply RefSessions
                  ) e
                  left join tblBookSession b
                    on e.EmployeeID = b.EmployeeID
                    and e.sessionid = b.sessionid
                  left join tblMembers m
                    on b.MemberNo = m.MemberNo
            ) x
            pivot 
            (
                max(FirstName)
                for Session in (' + @cols + ')
            ) p '

execute(@query)

デモで SQL Fiddle を参照してください

于 2012-10-10T11:06:30.740 に答える