表格将字段值移至列

时间:2014-07-25 22:21:46

标签: sql sql-server sql-server-2008-r2

我的主要问题是,我不确定自己要做什么,所以我不知道如何研究它。如果有人能给我一些术语或方向或答案,我将非常感激。

我知道我的最终目标是什么,我只是不知道正确的条款是什么。

我有一个返回此的查询:

select *
from details
where EventId in (1,2,3)

╔═════════╦═════════╦═════╦═══════════════════════╦══════╗
║ EventId ║  Name   ║ Col ║       StrValue        ║ Col6 ║
╠═════════╬═════════╬═════╬═══════════════════════╬══════╣
║       1 ║ Person  ║   0 ║ Alice.Anderson        ║ NULL ║
║       1 ║ Machine ║   0 ║ SPOT-001              ║ NULL ║
║       1 ║ Address ║   1 ║ 10.0.0.14             ║ NULL ║
║       1 ║ Pool    ║   0 ║ GT2                   ║ NULL ║
║       2 ║ Person  ║   0 ║ Bob.Barker            ║ NULL ║
║       2 ║ Machine ║   0 ║ SPOT-006              ║ NULL ║
║       2 ║ Address ║   1 ║ 10.0.0.19             ║ NULL ║
║       2 ║ Pool    ║   0 ║ GT2                   ║ NULL ║
║       3 ║ Person  ║   0 ║ Christine.Christensen ║ NULL ║
║       3 ║ Machine ║   0 ║ SPOT-003              ║ NULL ║
║       3 ║ Address ║   1 ║ 10.0.0.34             ║ NULL ║
║       3 ║ Pool    ║   0 ║ GO1                   ║ NULL ║
╚═════════╩═════════╩═════╩═══════════════════════╩══════╝

我想要一个返回此查询的查询,其中第2列和第3列的名称基于上表中的字段:

╔═════════╦══════════╦═══════════════════════╗
║ EventId ║ Machine  ║        Person         ║
╠═════════╬══════════╬═══════════════════════╣
║       1 ║ SPOT-001 ║ Alice.Anderson        ║
║       2 ║ SPOT-006 ║ Bob.Barker            ║
║       3 ║ SPOT-003 ║ Christine.Christensen ║
╚═════════╩══════════╩═══════════════════════╝

我已经能够接近case whenselect case when Name in ('Person','Machine') then EventId end, case Name when 'Machine' then StrValue end, case Name when 'Person' then StrValue end from details where EventId = 1 ╔═════════╦══════════╦════════════════╗ ║ EventId ║ Machine ║ Person ║ ╠═════════╬══════════╬════════════════╣ ║ NULL ║ NULL ║ NULL ║ ║ 1 ║ Spot-001 ║ NULL ║ ║ 1 ║ NULL ║ Alice.Anderson ║ ║ NULL ║ NULL ║ NULL ║ ║ NULL ║ NULL ║ NULL ║ ║ NULL ║ NULL ║ NULL ║ ║ NULL ║ NULL ║ NULL ║ ╚═════════╩══════════╩════════════════╝ 语句的集合,但总是有很多空值,它并没有像我需要的那样崩溃。

我尝试过类似的东西,并得到以下内容:

{{1}}

但我不知道如何折叠这两行并忽略所有空值,或者如果有更好的方法在大型表上执行此操作。

1 个答案:

答案 0 :(得分:2)

我很确定这会为您提供您期望的输出:

select 
  EventId,
  max(case Name when 'Machine' then StrValue end) as machine,
  max(case Name when 'Person' then StrValue end) as person
from details
where EventId = 1
  and name in ('Person','Machine')
group by EventId