Sql server SQL Server在对列上取消PIVOT

Sql server SQL Server在对列上取消PIVOT,sql-server,sql-server-2008,unpivot,Sql Server,Sql Server 2008,Unpivot,我为这个措辞拙劣的标题道歉,我不知道该如何描述这个问题 我在SQL Server 2008中有一个表,除了不可靠的模式外,它看起来像这样: 我希望处理给定“名称”的查询以生成以下结果: 我看了很多透视表示例,并得出了一些不确定的结果。我在高级复杂查询方面没有太多的实践 编辑:这里有一个SQL Fiddle链接:不清楚您想要什么,但这里有一个查询来获取您的输出结果: select 'DESCRIPTOR1' as Descr, DESCRIPTOR1A as A,

我为这个措辞拙劣的标题道歉,我不知道该如何描述这个问题

我在SQL Server 2008中有一个表,除了不可靠的模式外,它看起来像这样:

我希望处理给定“名称”的查询以生成以下结果:

我看了很多透视表示例,并得出了一些不确定的结果。我在高级复杂查询方面没有太多的实践


编辑:这里有一个SQL Fiddle链接:

不清楚您想要什么,但这里有一个查询来获取您的输出结果:

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

不清楚您想要什么,但这里有一个查询来获取您的输出结果:

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

将列转换为行的过程称为UNPIVOT。由于您使用的是SQL Server 2008,因此可以将交叉应用与值构造函数一起使用以获得结果:

select type, A, B
from mytable
cross apply
(
  values
    ('Descriptor1', Descriptor1A, Descriptor1B),
    ('Descriptor2', Descriptor2A, Descriptor2B)
) c (type, A, B)
where name = 'Bob';

请参见

将列转换为行的过程称为UNPIVOT。由于您使用的是SQL Server 2008,因此可以将交叉应用与值构造函数一起使用以获得结果:

select type, A, B
from mytable
cross apply
(
  values
    ('Descriptor1', Descriptor1A, Descriptor1B),
    ('Descriptor2', Descriptor2A, Descriptor2B)
) c (type, A, B)
where name = 'Bob';

请参见

我将对问题进行编辑以使其更加清晰,但在这种情况下,查询将使用name=“Bob”。“John”行是无关的信息。我将编辑问题以使其更清楚,但在这种情况下,查询将使用name=“Bob”。“约翰”一行是无关信息。是的,它不是一个支点。是的,它不是一个支点。如果我能接受多个答案就好了。我甚至不知道交叉申请的存在!我还没有找到这类事情的可靠参考资料。@ubertastic没问题,我只是想展示另一种方法要是我能接受不止一个答案就好了。我甚至不知道交叉申请的存在!我还没有找到这类事情的可靠参考资料。@ubertastic没问题,我只是想展示另一种方法