1

次のデータセットがあるとします

+--------------+-----------------------------+------------+-----+-----------+-----------+
| account_name |     PositionDescription     |  FullDate  | Day |  DayName  | ShiftType |
+--------------+-----------------------------+------------+-----+-----------+-----------+
| employee1    | Customer Support Specialist | 2012-11-01 |   1 | Thursday  | G         |
| employee1    | Customer Support Specialist | 2012-11-03 |   3 | Saturday  | G         |
| employee1    | Customer Support Specialist | 2012-11-05 |   5 | Monday    | G         |
| employee1    | Customer Support Specialist | 2012-11-06 |   6 | Tuesday   | G         |
| employee1    | Customer Support Specialist | 2012-11-08 |   8 | Thursday  | G         |
| employee1    | Customer Support Specialist | 2012-11-10 |  10 | Saturday  | G         |
| employee1    | Customer Support Specialist | 2012-11-12 |  12 | Monday    | G         |
| employee1    | Customer Support Specialist | 2012-11-13 |  13 | Tuesday   | G         |
| employee1    | Customer Support Specialist | 2012-11-15 |  15 | Thursday  | G         |
| employee1    | Customer Support Specialist | 2012-11-17 |  17 | Saturday  | G         |
| employee1    | Customer Support Specialist | 2012-11-19 |  19 | Monday    | G         |
| employee1    | Customer Support Specialist | 2012-11-20 |  20 | Tuesday   | G         |
| employee1    | Customer Support Specialist | 2012-11-22 |  22 | Thursday  | G         |
| employee1    | Customer Support Specialist | 2012-11-24 |  24 | Saturday  | G         |
| employee1    | Customer Support Specialist | 2012-11-26 |  26 | Monday    | G         |
| employee1    | Customer Support Specialist | 2012-11-27 |  27 | Tuesday   | G         |
| employee1    | Customer Support Specialist | 2012-11-29 |  29 | Thursday  | G         |
| employee2    | Game Support Specialist     | 2012-11-02 |   2 | Friday    | M         |
| employee2    | Game Support Specialist     | 2012-11-03 |   3 | Saturday  | M         |
| employee2    | Game Support Specialist     | 2012-11-04 |   4 | Sunday    | M         |
| employee2    | Game Support Specialist     | 2012-11-07 |   7 | Wednesday | M         |
| employee2    | Game Support Specialist     | 2012-11-09 |   9 | Friday    | M         |
| employee2    | Game Support Specialist     | 2012-11-10 |  10 | Saturday  | M         |
| employee2    | Game Support Specialist     | 2012-11-11 |  11 | Sunday    | M         |
| employee2    | Game Support Specialist     | 2012-11-14 |  14 | Wednesday | M         |
| employee2    | Game Support Specialist     | 2012-11-16 |  16 | Friday    | M         |
| employee2    | Game Support Specialist     | 2012-11-17 |  17 | Saturday  | M         |
| employee2    | Game Support Specialist     | 2012-11-18 |  18 | Sunday    | M         |
| employee2    | Game Support Specialist     | 2012-11-21 |  21 | Wednesday | M         |
| employee2    | Game Support Specialist     | 2012-11-23 |  23 | Friday    | M         |
| employee2    | Game Support Specialist     | 2012-11-24 |  24 | Saturday  | M         |
| employee2    | Game Support Specialist     | 2012-11-25 |  25 | Sunday    | M         |
| employee2    | Game Support Specialist     | 2012-11-28 |  28 | Wednesday | M         |
| employee2    | Game Support Specialist     | 2012-11-30 |  30 | Friday    | M         |
+--------------+-----------------------------+------------+-----+-----------+-----------+

この表のようにフォーマットすることは可能ですか?

+--------------+-----------------------------+----------------+
| account_name |     PositionDescription     | 1 | 2 | 3 | 4  | and so on...
+--------------+-----------------------------+------------+---+
| employee1    | Customer Support Specialist | G | G | G | G  |
| employee2    | Game Support Specialist     | G | G | G | G  | 
+-----------------------------+------------+-----+------------+

PIVOT を使用してそれを理解しようとしていましたが、取得できません。それが可能かどうかはわかりません:(

これが元のクエリだとします

SELECT   account_name               
                ,PositionDescription ,FullDate, Day, DayName ,ShiftType         
        FROM ManpowerSchedule ms 
4

2 に答える 2

2

適切に機能させるための構文に他のものがいくつか欠けているため、回答を追加しています。PIVOT関数を使用して、必要な結果を取得できます。PIVOT静的バージョンまたは動的バージョン を使用するには、2 つの方法があります。

静的バージョンでは、変換が必要なすべての値をハードコーディングします。

select  * 
from  
( 
  select account_name, PositionDescription, ShiftType, day
  from ManpowerSchedule 
) src
pivot   
( 
  max(ShiftType) 
  FOR day IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], .....) 
)  piv;

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

変換する必要がある列の数が不明な場合は、動的 SQL を使用できます。

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

select @cols = STUFF((SELECT ',' + QUOTENAME(day) 
                    from ManpowerSchedule
                    group by day
                    order by day
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsNull = STUFF((SELECT ', IsNull(' + QUOTENAME(day) +', '''') as '+QUOTENAME(day)
                    from ManpowerSchedule
                    group by day
                    order by day
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT account_name, PositionDescription, ' + @colsNull + ' 
              from 
              (
                select account_name, PositionDescription, ShiftType, day
                from ManpowerSchedule 
              ) x
              pivot 
              (
                max(ShiftType)
                for day in (' + @cols + ')
              ) p '

execute(@query)

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

関数にアクセスできない場合はPIVOT、集計関数とCASEステートメントを使用して複製できます。

select account_name, 
  PositionDescription,
  max(case when day = 1 then shifttype else '' end) [1],
  max(case when day = 2 then shifttype else '' end) [2],
  max(case when day = 3 then shifttype else '' end) [3],
  max(case when day = 4 then shifttype else '' end) [4],
  max(case when day = 5 then shifttype else '' end) [5],
  max(case when day = 6 then shifttype else '' end) [6],
  max(case when day = 7 then shifttype else '' end) [7],
  max(case when day = 8 then shifttype else '' end) [8],
  max(case when day = 9 then shifttype else '' end) [9],
  max(case when day = 10 then shifttype else '' end) [10]
from ManpowerSchedule
group by account_name, PositionDescription

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

3 つのバージョンすべてで同じ結果が得られます。

于 2012-11-09T10:30:23.837 に答える
1
SELECT  * 
FROM    ( select account_name ,PositionDescription  from ManpowerSchedule )
 PIVOT   ( max([ShiftType ]) FOR day IN ([1], [2],......) )  f;
于 2012-11-09T08:20:08.583 に答える