繁体   English   中英

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

[英]SQL Query to compare two values which are in the same column but returned by two different set of queries

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

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

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

您想要模拟数据透视表,因为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玩

在Postgres中,您可以使用以下方法:

select parameter, (array_agg(result))[1], (array_agg(result))[2] from my_table group by parameter;

这个想法是:将给定参数的所有结果聚合到一个结果数组中,然后从这些数组中获取单个元素。

我认为您可以通过使用GROUP_CONCAT()在MySQL中实现类似的功能,尽管它返回的是字符串而不是数组,因此您无法轻松地对其进行索引。 但是之后您可以按逗号分开。

如果使用的是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
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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM