我有一张类似下图所示的表格。
-----------------------------
JOB ID | parameter | result |
-----------------------------
1 | xyz | 10 |
1 | abc | 15 |
2 | xyz | 12 |
2 | abc | 8 |
2 | mno | 20 |
-----------------------------
我想要的结果如下所示。
parameter | result 1 | result 2 |
----------------------------------
xyz | 10 | 12 |
mno | NULL | 20 |
abc | 15 | 8 |
----------------------------------
我的目标是拥有一个可以比较两个不同作业的结果值的表格。它可以是两个或更多个工作。
答案 0 :(得分:2)
你想模拟一个数据透视表,因为mysql没有枢轴。
select
param,
max(case when id = 1 then res else null end) as 'result 1',
max(case when id = 2 then res else null end) as 'result 2'
from table
group by param
答案 1 :(得分:0)
在Postgres中,你可以使用类似的东西:
select parameter, (array_agg(result))[1], (array_agg(result))[2] from my_table group by parameter;
这个想法是:将给定参数的所有结果聚合到一个结果数组中,然后从这些数组中获取单个元素。
我认为你可以使用GROUP_CONCAT()
在MySQL中实现类似的东西,虽然它返回一个字符串而不是一个数组,所以你不能轻易地索引它。但是之后你可以用逗号分隔。
答案 2 :(得分:0)
如果您使用MySQL,则没有“外部联接”需要使用联合左右联接: 类似的东西:
select t1.parameter, t1.result 'Result 1', t2.result 'Result 2' from
table as t1 left join table as t2
on t1.parameter=t2.parameter
where t1.'JOB ID' = 1 and t2.'JOB ID' = 2
union
select t1.parameter, t1.result 'Result 1', t2.result 'Result 2' from
table as t1 right join table as t2
on t1.parameter=t2.parameter
where t1.'JOB ID' = 1 and t2.'JOB ID' = 2
如果具有完全外部联接的SQL将使其更容易:
select t1.parameter, t1.result 'Result 1', t2.result 'Result 2' from
table as t1 outer join table as t2
on t1.parameter=t2.parameter
where t1.'JOB ID' = 1 and t2.'JOB ID' = 2
答案 3 :(得分:0)
select q1.parameter, q2.result as r1, q3.result as r2
from
(select distinct parameter from temp2) q1
left join (select parameter, result from temp2 where job_id = 1) q2
on q1.parameter = q2.parameter
left join (select parameter, result from temp2 where job_id = 2) q3
on q1.parameter = q3.parameter;
它有效,但效率不高。尽管如此,因为我正在努力解决一些比所提出的更复杂的事情,这可能有助于形成你的一般解决方案。
虽然我在这里,但这是一个稍微清洁的解决方案:
select distinct q1.parameter, q2.result as r1, q3.result as r2
from
temp2 q1
left join (select parameter, result from temp2 where job_id = 1) q2
on q1.parameter = q2.parameter
left join (select parameter, result from temp2 where job_id = 2) q3
on q1.parameter = q3.parameter;