不同行的不同列之间的SQL差异

问题描述 投票:0回答:1

可以说我有一张表如下:

| id | dir | p1  | p2  |
|----------------------|
| a  | x   | 1.2 | 1.3 |
| a  | x   | 1.2 | 1.3 |
| a  | z   | 2.1 | 3   |
| a  | z   | 2.1 | 3   |
| b  | x   | 1   | null|
| b  | z   | 4   | null|

我想拥有行a和b的唯一行,其中dir = x和dir = z。所以每行两行。然后当dir = z。将p1 - (该id的前一行的p2)中的值作为newval1,将p2中的值 - (该id的前一行的p1)作为新的val2。将空值视为零。在步骤中,我认为它将是:

| id | dir | p1  | p2  |
|----------------------|
| a  | x   | 1.2 | 1.3 |
| a  | z   | 2.1 | 3   |
| b  | x   | 1   | null|
| b  | z   | 4   | null|

期望的结果将是:

| id | newval1       | newval2   | 
|--------------------------------|
| a  | 0.8(2.1-1.3)  | 1.8(3-1.2 |
| b  |  4 (4-0)      | -1(0-1)   |

是否可以在SQL中执行此操作?

oracle
1个回答
1
投票
select id,
       nvl(max(case when dir = 'z' then p1 end), 0)
         - nvl(max(case when dir = 'x' then p2 end), 0) as newval1,
       nvl(max(case when dir = 'z' then p2 end), 0)
         - nvl(max(case when dir = 'x' then p1 end), 0) as newval2
from   tbl
where  dir in ('x', 'z')
group by id
;

ID    NEWVAL1    NEWVAL2
-- ---------- ----------
a          .8        1.8
b           4         -1

或者,如果您使用的是11.1或更高版本,则可以使用pivot运算符:

select id, z_p1 - x_p2 as newval1, z_p2 - x_p1 as newval2
from   tbl
pivot  ( max(nvl(p1, 0)) as p1, max(nvl(p2, 0)) as p2
         for dir in ('x' as x, 'z' as z)
       )
;
© www.soinside.com 2019 - 2024. All rights reserved.