1

これは従業員の休日を追跡するための私のテーブルです。この例は 1 人だけのものです。

ID   PID     Year       OffDays       DayTypeNumber
------------------------------------------
1     1      2011       10            1
2     1      2011       5             2
3     1      2012       20            1
4     1      2012       3             2

追加の列を使用して、毎年 1 つの結果のみを表示するようなクエリを作成したいと思います

Year       OffDays(1)    OffDays(2)
------------------------------------------
2011       10            5
2012       20            3
4

1 に答える 1

3

PIVOTこれには次の関数を使用できます。

select year,
  [1] [OffDays(1)],
  [2] [OffDays(2)]
from
(
  select year, offdays, daytypenumber
  from yourtable
) src
pivot
(
  sum(offdays)
  for daytypenumber in([1], [2])
) piv

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

結果:

| YEAR | OFFDAYS(1) | OFFDAYS(2) |
----------------------------------
| 2011 |         10 |          5 |
| 2012 |         20 |          3 |

CASEまたは、次のステートメントで集計関数を使用できます。

select year,
  sum(case when daytypenumber = 1 then offdays end) [OffDays(1)],
  sum(case when daytypenumber = 2 then offdays end) [OffDays(2)]
from yourtable
group by year

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

比較するタイプが 2 つしかない場合は、サブクエリを使用できます。

select t1.year, 
  [OffDays(1)],
  [OffDays(2)]
from
(
  select sum(offdays) [OffDays(1)], year
  from yourtable
  where daytypenumber = 1
  group by year
) t1
left join
(
  select sum(offdays) [OffDays(2)], year
  from yourtable
  where daytypenumber = 2
  group by year
) t2
  on t1.year = t2.year

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

の値の数がわかっている場合、上記の答えはうまく機能しますがDayTypeNumber、それらが不明な場合は、動的 SQL を使用して を生成できますPIVOT

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(DayTypeNumber) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colNames = STUFF((SELECT distinct ', ' + QUOTENAME(DayTypeNumber) 
                      +' as [OffDays('+cast(DayTypeNumber as varchar(10))+')]'
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT year,' + @colNames + ' from 
             (
                select year, offdays, daytypenumber
                from yourtable
            ) x
            pivot 
            (
                sum(offdays)
                for daytypenumber in (' + @cols + ')
            ) p '

execute(@query)

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

これらはすべて同じ結果になります。

| YEAR | OFFDAYS(1) | OFFDAYS(2) |
----------------------------------
| 2011 |         10 |          5 |
| 2012 |         20 |          3 |
于 2012-11-28T11:27:48.530 に答える