对于给您带来的不便,我们深感抱歉,我想我正在简化这个问题,但也许是我使这个问题变得更加复杂了,以前的数据就是这样,
表格:
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
答案 0 :(得分:2)
我想您想要的输出是基本上压缩新记录以使其并列显示,而不是在下面作为新条目。因此,acmcd = 112
和acmcd = 212
之间没有任何关系,只是它们是表中branchcd
的相应“ bal”下的第二个可用条目。看来acmcd
列为每个新添加的行都获得唯一的值(顺序地或不顺序地)。
如果以上陈述为真,则可以使用row_number()
为给定acmcds
的每个唯一BRANCHCD
生成ID。通过cte或子查询将bal1和bal2记录创建为单独的数据集,我们可以在FULL OUTER JOIN
上进行row_number
。
查询:
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的后两位。否则,您不会向查询表明这些记录之间的关系。