sql查询结果格式

时间:2018-08-10 15:41:26

标签: sql oracle oracle10g

对于给您带来的不便,我们深感抱歉,我想我正在简化这个问题,但也许是我使这个问题变得更加复杂了,以前的数据就是这样,

表格:

BRANCHCD       BAL1    BAL2   ACMCD
SH14           10        -      111
SH14           11        -      112
SH14            -         1     211 

在一个表中有acmcd的bal1和acmcd的bal2,一次只能使用一次,所以不用担心这种情况,所以我需要以下格式。

  BRANCHCD       BAL1    ACMCD   bal2  acmcd
    SH14           10      111      1    211
    SH14           11      112

如果在表中添加的新行是:

BRANCHCD       BAL1    BAL2   ACMCD
SH14                     2      212
SH14                     3      213

那么o / p应该是

  BRANCHCD       BAL1    ACMCD   bal2  acmcd
    SH14           10      111      1    211
    SH14           11      112      2    212
    SH14                            3    213

2 个答案:

答案 0 :(得分:2)

我想您想要的输出是基本上压缩新记录以使其并列显示,而不是在下面作为新条目。因此,acmcd = 112acmcd = 212之间没有任何关系,只是它们是表中branchcd的相应“ bal”下的第二个可用条目。看来acmcd列为每个新添加的行都获得唯一的值(顺序地或不顺序地)。

如果以上陈述为真,则可以使用row_number()为给定acmcds的每个唯一BRANCHCD生成ID。通过cte或子查询将bal1和bal2记录创建为单独的数据集,我们可以在FULL OUTER JOIN上进行row_number

SQL Fiddle

查询

WITH a 
     AS (SELECT row_number() 
                  OVER( 
                    partition BY branchcd 
                    ORDER BY acmcd ) AS rn, 
                t.* 
         FROM   t 
         WHERE  bal1 IS NOT NULL), 
     b 
     AS (SELECT row_number() 
                  OVER( 
                    partition BY branchcd 
                    ORDER BY acmcd ) AS rn, 
                t.* 
         FROM   t 
         WHERE  bal2 IS NOT NULL) 
SELECT COALESCE(a.branchcd,b.branchcd) as branchcd,
       a.bal1, 
       a.acmcd, 
       b.bal2, 
       b.acmcd 
FROM   a 
       FULL OUTER JOIN b 
                    ON ( a.branchcd = b.branchcd 
                         AND a.rn = b.rn )

Results

| BRANCHCD |   BAL1 |  ACMCD | BAL2 | ACMCD |
|----------|--------|--------|------|-------|
|     SH14 |     10 |    111 |    1 |   211 |
|     SH14 |     11 |    112 |    2 |   212 |
|     SH14 | (null) | (null) |    3 |   213 |

答案 1 :(得分:0)

除非您的表中有您不希望与我们共享的更多列,否则您似乎需要在表C的左连接中添加一些内容,以比较ACMCD的后两位。否则,您不会向查询表明这些记录之间的关系。