Sql 外部联接或联合所有以将行转换为列

Sql 外部联接或联合所有以将行转换为列,sql,join,hive,union-all,Sql,Join,Hive,Union All,我有什么:桌子 _______________________________________ | MachUUID | State| Pass | Fail | |-------------------------------------- | 1234 | A | 0.2 | 0.98 | | 1234 | B | 0.5 | 0.5 | | 1234 | C

我有什么:桌子

 _______________________________________            
 | MachUUID | State|  Pass   | Fail    |   
 |--------------------------------------
 |  1234    | A    |   0.2   |    0.98 |  
 |  1234    | B    |   0.5   |    0.5  |  
 |  1234    | C    |   0.8   |    0.2  |
 ---------------------------------------
我想要的:转换的\u表

 | MachUUID | A_Pass | A_Fail | B_Pass | B_Fail | C_Pass | C_Fail
  --------------------------------------------------------------
 |  1234    |  0.2   | 0.98   |  0.5   |  0.5   | 0.8    |  0.2 
状态数(A、B等是固定的)。目前,它们最多有20个。所以要改变这个

我在做什么

Transformed_Table AS (
SELECT MachUUID, Pass AS A_Pass, Fail AS A_Fail
FROM table
WHERE State = 'A'
UNION ALL

SELECT MachUUID, Pass AS B_Pass, Fail AS B_Fail
FROM table
WHERE State = 'B'
UNION ALL

SELECT MachUUID, Pass AS C_Pass, Fail AS C_Fail
FROM table
WHERE State = 'C')
然而,这返回了一个奇怪的组合,它看起来像:

我得到的输出错误

| MachUUID | A_Pass| A_Fail |
|   1234   | 0.2   | 0.98   |
|   1234   | 0.5   | 0.5    |
|   1234   | 0.8   | 0.2    |
问题

我认为我对工会的理解在这一点上是不正确的。我了解外套,我想知道这是否是一个更好的方式做这件事


我愿意听取关于解决此问题的其他方法的建议

您可以使用条件聚合:

select MachUUID,
       max(case when state = 'A' then pass end) as a_pass,
       max(case when state = 'A' then fail end) as a_fail,
       max(case when state = 'B' then pass end) as b_pass,
       max(case when state = 'B' then fail end) as b_fail,
       max(case when state = 'C' then pass end) as c_pass,
       max(case when state = 'C' then fail end) as c_fail
from t
group by MachUUID

可以使用条件聚合执行此操作:

select MachUUID,
       max(case when state = 'A' then pass end) as a_pass,
       max(case when state = 'A' then fail end) as a_fail,
       max(case when state = 'B' then pass end) as b_pass,
       max(case when state = 'B' then fail end) as b_fail,
       max(case when state = 'C' then pass end) as c_pass,
       max(case when state = 'C' then fail end) as c_fail
from t
group by MachUUID

公共pivot技术使用groupby和条件聚合:@markuswin链接方法的问题是,我必须使用case语句,如
case state='a',然后将Pass End作为_Pass
case state='a',然后将Fail End作为_Fail
。我不确定如果我有两个case语句评估完全相同的case,它们都会被执行公共pivot技术使用groupby和条件聚合:@markuswin链接方法的问题是,我必须使用一个case语句,比如
case state='a',然后将Pass End作为\u Pass
case state='a',然后将Fail End作为\u Fail
。我不确定如果我有两个案例陈述来评估完全相同的案例,它们都会从我正在阅读的一些文献中执行,我的理解是,如果我有两个案例,都评估完全相同的条件,RDBMS将明智地不同时检查这两个。@ExceptionHandler。在某些数据库中可能是这样,但与移动数据的工作相比,这是一个微观优化。我不确定我是否理解你的评论。我担心,如果它以这种方式优化,我将永远无法了解全部情况。如中所示,进行此优化实际上会使结果出错。@ExceptionHandler。我不明白你的担心。如果忽略
case
表达式的
部分,则这将是一个bug。结果集应该是查询所表达的内容。从我阅读的一些文献中,我的理解是,如果我有两个案例,它们都评估完全相同的条件,RDBMS最好不要同时检查这两个案例。@ExceptionHandler。在某些数据库中可能是这样,但与移动数据的工作相比,这是一个微观优化。我不确定我是否理解你的评论。我担心,如果它以这种方式优化,我将永远无法了解全部情况。如中所示,进行此优化实际上会使结果出错。@ExceptionHandler。我不明白你的担心。如果忽略
case
表达式的
部分,则这将是一个bug。结果集应该是查询所表达的内容。