[英]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
在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.