Oracle SQL - 将多行与分析函数组合时,“偏好”某些值而不是其他

时间:2016-01-20 00:57:56

标签: sql oracle

我可能会这样做:

select 
  max(val), max(val2), max(val3) from table
group by
  val4;

获取此示例输出:

Table
val1   val2   val3   val4
A      P      Z      1
P      Z      P      1

对于我的用例,我们假设'P'是一个重要的值,所以如果在按val4分组时某个P出现在某个地方,那就是我要表达的值。也就是说,在这种情况下,我希望在val4分组时为val1,val2,val3表示('P','P','P')。

如何或应该如何做到这一点?

3 个答案:

答案 0 :(得分:2)

我只会使用条件聚合。例如:

select coalesce(max(case when val1 = 'P' then val end), max(val1)) as val1,
       coalesce(max(case when val2 = 'P' then val end), max(val2)) as val2,
       coalesce(max(case when val3 = 'P' then val end), max(val3)) as val3
from table
group by val4;

如果任何值与'P'匹配,则每个coalesce()中的第一个表达式返回'P'。如果没有,则返回最大值。

答案 1 :(得分:0)

您最初可以使用ascii将字符转换为ascii值,然后使用P的特殊情况,以使值超出范围。 A-Z的ASCII范围为65-90。

要取回字符值,请使用chr函数。

此解决方案假设所有字符值都是大写和单个字符。

SQL Fiddle

select 
val4,
case when val1 = 100 then 'P' else chr(val1) end val1,
case when val2 = 100 then 'P' else chr(val2) end val2,
case when val3 = 100 then 'P' else chr(val3) end val3
from (
select 
val4,
max(case when val1 = 'P' then 100 else ascii(val1) end) val1,
max(case when val2 = 'P' then 100 else ascii(val2) end) val2,
max(case when val3 = 'P' then 100 else ascii(val3) end) val3 
from t
group by val4) t

答案 2 :(得分:0)

select
RIGHT(MAX(CASE WHEN val1='P' THEN {fn CONCAT(1,val1)} ELSE {fn CONCAT(0,val1)} end),1),
RIGHT(MAX(CASE WHEN val2='P' THEN {fn CONCAT(1,val2)} ELSE {fn CONCAT(0,val2)} end),1),
RIGHT(MAX(CASE WHEN val3='P' THEN {fn CONCAT(1,val3)} ELSE {fn CONCAT(0,val3)} end),1),
val4
Group by val4

上面的Intersystems Cache SQL ..应该适用于其他风格?

select
RIGHT(MAX(CASE WHEN val1='P' THEN CONCAT(1,val1) ELSE CONCAT(0,val1) end),1),
RIGHT(MAX(CASE WHEN val2='P' THEN CONCAT(1,val2) ELSE CONCAT(0,val2) end),1),
RIGHT(MAX(CASE WHEN val3='P' THEN CONCAT(1,val3) ELSE CONCAT(0,val3) end),1),
val4
Group by val4