0

次のような「CertificateEntries」のテーブルがあります。

Entity_ID | Certificate_ID | CertificateExpiry
1         | 1              | dd/mm/YYYY
1         | 2              | dd/mm/YYYY

など。これは本質的に多対多の関係であり、エンティティは多くの証明書を持つことができ、証明書は多くのエンティティに割り当てることができます。

私がやりたいのは、これをピボットして、証明書のリストが列になるようにすることです。

Entity_ID | 1 | 2 | 3 | 4 |
1         | T | T | F | F |
2         | T | F | F | T |

これを行う方法がよくわかりません。すべてのオンラインの例は、COUNT、MAX、AVG などが必要であることを示しているようです。理想的には、T/F の代わりに有効期限を設定したいのですが、それが不可能な場合、 私が理解することができます...

誰かが私を正しい方向に向けるのを助けることができれば、それは素晴らしいことです. ありがとう。

4

1 に答える 1

1

これを試して :

begin try
create table #test 
(Entity_ID int,Certificate_ID int,CertificateExpiry date)

insert into #test values(1,1,'01/01/2013')
insert into #test values(1,2,'05/01/2013')
insert into #test values(1,5,'01/05/2013')
insert into #test values(1,9,'05/12/2013')

insert into #test values(2,1,'10/05/2013')
insert into #test values(2,2,'12/03/2013')
insert into #test values(4,6,'2/05/2013')
insert into #test values(5,8,'4/09/2013')

--select * from #test

DECLARE @Certificate_Ids VARCHAR(8000)


SELECT @Certificate_Ids = COALESCE(@Certificate_Ids + '], [', '') + cast(Certificate_ID as varchar(20)) FROM 
(select distinct Certificate_ID from #test ) as a


Set @Certificate_Ids='['+@Certificate_Ids+']'

--print @Certificate_Ids


Declare @query varchar(max)


Set @query=
'SELECT
Entity_ID, ' + @Certificate_Ids + ' 
FROM #test
PIVOT
(
  MAX(CertificateExpiry)
  FOR Certificate_ID in (' + @Certificate_Ids + ' )   
) A'

print @query

exec(@query)


drop table #test
end try

begin catch
drop table #test
end catch
于 2013-02-15T05:57:24.997 に答える