抱歉给您带来不便,我想我正在简化这个问题,但可能是因为它变得更加复杂,以前的数据是这样的,

表:

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

如果在Table中添加的新行是:
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

最佳答案

我想您想要的输出是基本上压缩新记录以使其并列显示,而不是在下面作为新条目。因此,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 |

07-24 15:21