SQL Query用于比较同一列中但由两组不同查询返回的两个值

时间:2016-04-27 20:57:15

标签: mysql sql

我有一张类似下图所示的表格。

-----------------------------
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       |
----------------------------------

我的目标是拥有一个可以比较两个不同作业的结果值的表格。它可以是两个或更多个工作。

4 个答案:

答案 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

SQL FIDDLE TO PLAY WITH

答案 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;