1

私はこのテーブルを持っています:

Person      Job     Day  EndDay
1           101     1    12
1           102     2    11
1           103     3    11
3           101     1    11
3           102     2    11 
3           JobOff  3    11
2           101     1    11
2           102     2    11
2           103     3    11
2           JobOff  4    11
...

PS: 私の日数は 'N' までですが、それはわかりません。したがって、ここでは静的 SQL は実行できません。

そして、それを次の形式に変更する必要があります。

Day (Columns)
Person  (Rows)
Person  1    2    3       4
1       101  102  103     N/A
2       101  102  103     JobOff
3       101  102  JobOff  N/A

どんな助けでも大歓迎です。私はSQLが初めてです。

ローマンのおかげで、私はこの S.Procedure を持っています:

CREATE PROCEDURE [dbo].[MyStoredProcedure] AS
BEGIN

declare @stmt nvarchar(max)

select @stmt =
    isnull(@stmt + ', ', '') + 
    'isnull(max(case when [Day] = ' + cast([Day_I] as nvarchar(max)) + 
    ' then Job end), ''N/A'') as [' + cast([Day_I] as nvarchar(max)) + ']'
from (select distinct [Day_I] from dbo.Solution) as t
order by [Day_I]

select @stmt = '
select
    Person_I, ' + @stmt +'
from dbo.Solution_Format
group by Person_I'

END

しかし、このストアド プロシージャを次のように実行すると、次のようになります。

exec MyStoredProcedure

結果が表示されません。エラーなし!

4

2 に答える 2

2

これを行う 1 つの方法は、複数の自己結合を使用することです。

Select
  t1.Person,
  COALESCE(t1.Job, 'N/A') [1],
  COALESCE(t2.Job, 'N/A' )[2],
  COALESCE(t3.Job, 'N/A') [3], 
  COALESCE(t4.Job, 'N/A') [4]
FROM 
  table1 t1
  LEFT JOIN table1  t2
  ON t1.Person =  t2.Person
    and t2.Day = 2
  LEFT JOIN table1  t3
   ON t1.Person =  t3.Person
     and t3.Day = 3
  LEFT JOIN table1  t4
    ON t1.Person =  t4.Person
     and t4.Day = 4
WHERE
   t1.Day = 1
ORDER BY 
  t1.Person

デモ

別の方法は MAX(CASE を使用することですが、私はこのような集計を使用するのが好きではありません。

Select
  t1.Person,
  COALESCE(MAX(CASE WHEN t1.Day = 1 then t1.Job END), 'N/A') [1],
  COALESCE(MAX(CASE WHEN t1.Day = 2 then t1.Job END), 'N/A') [2],
  COALESCE(MAX(CASE WHEN t1.Day = 3 then t1.Job END), 'N/A') [3],
  COALESCE(MAX(CASE WHEN t1.Day = 4 then t1.Job END), 'N/A') [4]

FROM 
  table1 t1
GROUP BY
  t1.Person

デモ

そして最後に、ここの MAX のためにあまり好きではないピボット句があります。

SELECT person, 
       COALESCE([1], 'N/A') [1], 
       COALESCE([2], 'N/A') [2], 
       COALESCE([3], 'N/A') [3], 
       COALESCE([4], 'N/A') [4] 
FROM   (SELECT t1.person, 
               t1.day, 
               t1.job 
        FROM   table1 t1) p 
       PIVOT (Max (job) 
             FOR day IN ( [1], 
                          [2], 
                          [3], 
                          [4]) ) AS pvt 

デモ

于 2013-09-19T19:20:28.063 に答える