抱歉给您带来不便,我想我正在简化这个问题,但可能是因为它变得更加复杂,以前的数据是这样的,
表:
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 = 112
和acmcd = 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 |