我想
如果两列(Name1,Name2)都是1,那么每个名称将有两行。例如,ID 3。
Input
ID Name1 Name2
1 1 0
2 0 1
3 1 1
Output
ID Name
1 Name1
2 Name2
3 Name1
3 Name2
我需要一些高级关键字吗?
答案 0 :(得分:2)
您应该能够使用UNPIVOT
函数来获得结果。这会将您的列转换为行,然后您可以根据原始列的值是0还是1来过滤最终结果:
select Id, Name
from <yourtable>
unpivot
(
value for
name in (Name1, Name2)
) u
where value <> 0
这是demo
答案 1 :(得分:1)
一种方法是使用union all
select id,
'Name1' as name
from your_table
where name1 = 1
union all
select id,
'Name2' as name
from your_table
where name2 = 1
如果列数更多,您还可以使用cross apply
:
select t.id, x.name
from your_table t
cross apply (
values (case when t.name1 = 1 then 'Name1' end),
(case when t.name2 = 1 then 'Name2' end),
(case when t.name3 = 1 then 'Name3' end)
) x (name)
where x.name is not null;
答案 2 :(得分:1)
您可以使用交叉申请并按以下方式获取:
select Id, nam as [Name] from #yournames
cross apply ( values (name1, 'name1'),(name2, 'name2')) v(n, nam)
where n = 1
输出:
+----+-------+
| Id | Name |
+----+-------+
| 1 | name1 |
| 2 | name2 |
| 3 | name1 |
| 3 | name2 |
+----+-------+
答案 3 :(得分:0)
如果只有3列,请使用union
select id, 'Name1' as Name from Input where Name1=1
union all
select id, 'Name2' as Name from Input where Name2=1