如何解决没有聚合函数的动态 TSQL Pivot
我有一个这样的表 ('ExternalPersonRelationTable')
PersonId | 主题代码 |
---|---|
4187 | 3 |
4187 | 278 |
4429 | 3 |
4429 | 4 |
4463 | 99 |
4464 | 174 |
4464 | 175 |
我想旋转数据,以便表格中的每个人都获得一列和每个主题代码的 TRUE/FALSE 值,即像这样的表格:
代码 | 4187 | 4429 | 4463 | 4464 |
---|---|---|---|---|
3 | 真的 | 真的 | 错误 | 错误 |
4 | 错误 | 真的 | 错误 | 错误 |
... | ||||
99 | 错误 | 错误 | 真的 | 错误 |
... | ||||
174 | 错误 | 错误 | 错误 | 真的 |
175 | 错误 | 错误 | 错误 | 真的 |
我认为这是一个我应该使用 PIVOT 和动态 SQL 解决的问题,但恐怕我的经验仅限于使用 CTE 和简单的 JOIN,所以我很难对数据进行透视,更不用说动态命名结果列。
SubjectCode 和 PersonId 最终将连接到其他表以获取它们的实际值,但对于示例,我认为它们是不必要的。
我该如何解决这个问题?
解决方法
示例数据
create table ExternalPersonRelationTable
(
PersonId int,SubjectCode int
);
insert into ExternalPersonRelationTable (PersonId,SubjectCode) values
(4187,3),(4187,278),(4429,4),(4463,99),(4464,174),175);
解决方案
以数据透视查询的(有限)静态版本作为参考。
select piv.SubjectCode as Code,isnull(convert(bit,piv.[4187]),0) as [4187],piv.[4429]),0) as [4429],piv.[4463]),0) as [4463],piv.[4464]),0) as [4464]
from ExternalPersonRelationTable epr
pivot (max(epr.PersonId) for epr.PersonId in ([4187],[4429],[4463],[4464])) piv;
识别动态部分并构建(并验证)它们。
-- constuct lists
declare @fieldList nvarchar(1000);
declare @pivotList nvarchar(1000);
with cte as
(
select epr.PersonId
from ExternalPersonRelationTable epr
group by epr.PersonId
)
select @fieldList = string_agg('isnull(convert(bit,piv.['
+ convert(nvarchar(10),cte.PersonId)
+ ']),0) as ['
+ convert(nvarchar(10),cte.PersonId)
+ ']',',') within group (order by cte.PersonId),@pivotList = string_agg('['
+ convert(nvarchar(10),') within group (order by cte.PersonId)
from cte;
-- validate lists
select @fieldList as FieldList;
select @pivotList as PivotList;
合并最终查询中的动态部分(并在开发阶段进行验证)。
-- construct query
declare @query nvarchar(3000) = 'select piv.SubjectCode as Code,'
+ @fieldList
+ 'from ExternalPersonRelationTable epr '
+ 'pivot (max(epr.PersonId) for epr.PersonId in ('
+ @pivotList
+ ')) piv;';
-- validate query
select @query as Query;
运行动态查询。
-- run query
exec sp_executesql @query;
结果
Code 4187 4429 4463 4464
---- ----- ----- ----- -----
3 True True False False
4 False True False False
99 False False True False
174 False False False True
175 False False False True
278 True False False False
Fiddle 查看实际情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。