对于措辞不佳的标题我很抱歉,我不确定该怎么描述这个问题。对列上的SQL Server Unpivot
我在SQL Server 2008中,它看起来像这样的表,靠不住的模式旁白:
我想处理赋予了“名”来产生这些结果的查询:
我看了一些数据透视表的例子,并得出了不确定的结果。在先进的复杂查询中我没有太多练习。
编辑:这是一个SQL小提琴链接:http://sqlfiddle.com/#!3/28f93/1
对于措辞不佳的标题我很抱歉,我不确定该怎么描述这个问题。对列上的SQL Server Unpivot
我在SQL Server 2008中,它看起来像这样的表,靠不住的模式旁白:
我想处理赋予了“名”来产生这些结果的查询:
我看了一些数据透视表的例子,并得出了不确定的结果。在先进的复杂查询中我没有太多练习。
编辑:这是一个SQL小提琴链接:http://sqlfiddle.com/#!3/28f93/1
目前尚不清楚你想要什么,但下面是一个查询,让您的输出结果:
select 'DESCRIPTOR1' as Descr,
DESCRIPTOR1A as A,
DESCRIPTOR1B as B
from mytable
where Name='Bob'
UNION ALL
select 'DESCRIPTOR2' as Descr ,
DESCRIPTOR2A as A,
DESCRIPTOR2B as B
from mytable
where Name='Bob'
或者如果你需要它的所有名字:
select Name,
'DESCRIPTOR1' as Descr,
DESCRIPTOR1A as A,
DESCRIPTOR1B as B
from mytable
UNION ALL
select Name,
'DESCRIPTOR2' as Descr ,
DESCRIPTOR2A as A,
DESCRIPTOR2B as B
from mytable
ORDER BY 1,2
太棒了!我想我毕竟不需要PIVOT功能.. – ubertastic
是的,它不是一个关键。 – valex
此过程用于列转换为行被称为一个UNPIVOT。由于使用的是SQL Server 2008中,你可以使用CROSS APPLY用VALUES构造函数来得到结果:
select type, A, B
from mytable
cross apply
(
values
('Descriptor1', Descriptor1A, Descriptor1B),
('Descriptor2', Descriptor2A, Descriptor2B)
) c (type, A, B)
where name = 'Bob';
如果只有我可以接受多个答案。我甚至不知道交叉应用存在!我还没有为这些事情找到一个可靠的参考。 – ubertastic
@ubertastic没问题,我只是想展示一个替代方法来做到这一点。 :) – Taryn
--Oracle version:
create table tst_unpivot
(
name varchar2(32) null,
descriptor1a varchar(32) null,
descriptor1b varchar(32) null,
descriptor2a varchar(32) null,
descriptor2b varchar(32) null
);
insert into tst_unpivot values ('Bob', 'Bob1A', 'Bob1B', 'Bob2A', 'Bob2B');
insert into tst_unpivot values ('Jon', 'Jon1A', 'Jon1B', 'Jon2A', 'Jon2B');
commit;
select a.name, a.descriptor, a, b
from
tst_unpivot unpivot (
a for descriptor in
(
descriptor1a as 'Descriptor1', descriptor2a as 'Descriptor2'
)
) a
full outer join
tst_unpivot unpivot (
b for descriptor in
(
descriptor1b as 'Descriptor1', descriptor2b as 'Descriptor2'
)
) b
on
a.name = b.name
and a.descriptor = b.descriptor;
create table tst_unpivot
(
name varchar(32) null,
descriptor1a varchar(32) null,
descriptor1b varchar(32) null,
descriptor2a varchar(32) null,
descriptor2b varchar(32) null
)
go
insert into tst_unpivot values ('Bob', 'Bob1A', 'Bob1B', 'Bob2A', 'Bob2B')
insert into tst_unpivot values ('Jon', 'Jon1A', 'Jon1B', 'Jon2A', 'Jon2B')
go
select a.name, a.descriptor, a as 'A', b as 'B'
from
(select name,descriptor1a as Descriptor1,descriptor2a as Descriptor2 from tst_unpivot) p1
unpivot
(
a for descriptor in
(
Descriptor1, Descriptor2
)
) a
full outer join
(select name,descriptor1b as Descriptor1,descriptor2b as Descriptor2 from tst_unpivot) p2
unpivot
(
b for descriptor in
(
Descriptor1, Descriptor2
)
) b
on
a.name = b.name
and a.descriptor = b.descriptor
约翰在哪儿? – valex
我将编辑问题更清楚,但在这种情况下,查询将具有名称=“Bob”。 “John”行是无关的信息。 – ubertastic