首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL UnPivot多列

SQL UnPivot多列
EN

Stack Overflow用户
提问于 2020-03-23 09:43:33
回答 3查看 96关注 0票数 0

我使用SSMS,我有一个表,看起来像这样;

代码语言:javascript
复制
ID   / Req1 / Req1Comment  / req2 / req2Commnet  /
1   /  yes /              / no   /  needs work  /
2  /  no  / not working  / yes  /              /

为了报告目的,我希望这些数据看起来像这样;

代码语言:javascript
复制
ID   / Requirement  / Requirement Status /  Comments
  1  /    Req 1    /   Yes              /
  1  /    Req 2   /    no               / Needs Work

我认为我需要使用un枢轴,但我不能让标题进入行和注释对齐总计,我有25个要求和25个注释字段。在我们的纸张表格上,它们已经静止多年了,所以我不担心将来会添加或删除新的列。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-23 09:51:43

是什么阻止您使用25项选择的联合?

代码语言:javascript
复制
select ID, 'Req 1' as Requirement, Req1 as RequirementStatus, Req1Comment as Comments from t
union all
select ID, 'Req 2' as Requirement, req2 as RequirementStatus, req2Comment as Comments from t
union all
...
select ID, 'Req 25' as Requirement, req25 as RequirementStatus, req25Comment as Comments from t
票数 2
EN

Stack Overflow用户

发布于 2020-03-23 11:26:34

我建议只使用cross apply

代码语言:javascript
复制
select t.id, v.*
from t cross apply
     (values ('Req 1', Req1, Req1Comment),
             ('Req 2', Req2, Req2Comment),
             . . .
     ) v(requirement, status, comments);

如果不想为values键入25行,可以使用电子表格生成代码。

票数 2
EN

Stack Overflow用户

发布于 2020-03-23 09:55:21

代码语言:javascript
复制
declare @t table
(
id int identity,
Req1 varchar(10),
Req1Comment varchar(20),
Req2 varchar(10),
Req2Comment varchar(20)
)

insert into @t (Req1, Req1Comment, Req2, req2Comment)
values
('yes', null, 'no', 'needs work'),
('no', 'not working', 'yes', '');


select id, 'Req 1' as Requirement, Req1 as [Requirement Status], Req1Comment as Comments
from @t
union all
select id, 'Req 2', Req2, Req2Comment
from @t;

select id, concat('Req ', v.val) as Requirement, case v.val when 1 then Req1 else Req2 end as [Requirement Status], case v.val when 1 then Req1Comment else Req2Comment end as Comments
from @t as t
cross apply (values(1), (2)) as v(val);

select id, concat('Req ', v.val) as Requirement, 
    choose(v.val, Req1, Req2) as [Requirement Status], 
    choose(v.val, Req1Comment, Req2Comment) as Comments
from @t as t
cross apply (values(1), (2)) as v(val);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60811058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档