2014-02-27 48 views
2

对于措辞不佳的标题我很抱歉,我不确定该怎么描述这个问题。对列上的SQL Server Unpivot

我在SQL Server 2008中,它看起来像这样的表,靠不住的模式旁白:

enter image description here

我想处理赋予了“名”来产生这些结果的查询:

enter image description here

我看了一些数据透视表的例子,并得出了不确定的结果。在先进的复杂查询中我没有太多练习。

编辑:这是一个SQL小提琴链接:http://sqlfiddle.com/#!3/28f93/1

+0

约翰在哪儿? – valex

+0

我将编辑问题更清楚,但在这种情况下,查询将具有名称=“Bob”。 “John”行是无关的信息。 – ubertastic

回答

2

目前尚不清楚你想要什么,但下面是一个查询,让您的输出结果:

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' 

SQL Fiddle demo

或者如果你需要它的所有名字:

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 

SQLFidle demo

+0

太棒了!我想我毕竟不需要PIVOT功能.. – ubertastic

+0

是的,它不是一个关键。 – valex

1

此过程用于列转换为行被称为一个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'; 

SQL Fiddle with Demo

+0

如果只有我可以接受多个答案。我甚至不知道交叉应用存在!我还没有为这些事情找到一个可靠的参考。 – ubertastic

+0

@ubertastic没问题,我只是想展示一个替代方法来做到这一点。 :) – Taryn

1
--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; 
0
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