我的主要问题是,我不确定自己要做什么,所以我不知道如何研究它。如果有人能给我一些术语或方向或答案,我将非常感激。
我知道我的最终目标是什么,我只是不知道正确的条款是什么。
我有一个返回此的查询:
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 when
个select
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}}
但我不知道如何折叠这两行并忽略所有空值,或者如果有更好的方法在大型表上执行此操作。
答案 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