【发布时间】:2019-02-19 14:56:30
【问题描述】:
我有以下问题。 我的表中有一些几乎相同的行,我需要一些单元格与上面的单元格连接。 我当前的 Select 语句如下所示:
Select bltgs1, bltgs2, bltgs3, bltgs4, bltgs5, bltgs6, bltugp
,regexp_replace(regexp_replace(LISTAGG(bltxt,' '),'\s+',' '),'¯+','') AS Text
from atdata.bip105
where bltspriso = 'DEAT'
group by bltgs1, bltgs2, bltgs3, bltgs4, bltgs5, bltgs6, blttkz, bltugp
order by bltgs1, bltgs2, bltgs3, bltgs4, bltgs5, bltgs6, blttkz, bltugp
BLTGS1-6 类似于类别,例如第一个条目看起来像 (0 = empty/null):“1-0-0-0-0-0-0-0 AKTIVA”第二个条目看起来像“1 -1-0-0-0-0-0 BTIVA”。 SO BTIVA 是 AKTIVA 的一个子类别。
BLTUGP 中有一些行包含 1 或 2。如果是这种情况,我想将TEXT 条目连接到上面的第一行,它不包含BLTUGP 中的数字。所以关于文本,它应该看起来像,例如:
BLTUGP| TEXT
| TOM
1 | likes salat.
2 | likes tomatoes.
此示例的输出应如下所示:
BLTUGP| TEXT
| TOM
1 | TOM likes salat.
2 | TOM like tomatoes.
例如,如您所见,带有“erhaltene Anzahlungen auf Bestellung”的行应如下所示:
2 - 1 - 12 - 01 - 007 - 01 - "erhaltene Anzahlungen auf Bestellung davon mit einer Restlaufzeit von bis zu einem Jahr"
和
2 - 1 - 12 - 01 - 007 - 02 - "erhaltene Anzahlungen auf Bestellung davon mit einer Restlaufzeit von mehr als einem Jahr"
....但我还需要所有 bltugp 为空/空的行。 附加信息!我无法操作/更改源表。
提前致谢!
更新: 我试过了
with
tbl_wougp as
(Select bltgs1, bltgs2, bltgs3, bltgs4, bltgs5, bltgs6, bltugp ,regexp_replace(regexp_replace(LISTAGG(bltxt,' '),'\s+',' '),'¯+','') AS Text
from atdata.bip105
where bltspriso = 'DEAT' and bltugp=''
group by bltgs1, bltgs2, bltgs3, bltgs4, bltgs5, bltgs6, blttkz, bltugp),
tbl_wugp as
(Select u.bltgs1, u.bltgs2, u.bltgs3, u.bltgs4, u.bltgs5, u.bltgs6, u.bltugp, concat(concat(trim(h.bltxt), ' '), trim(u.bltxt)) as Text from
(select * from atdata.bip105 where bltspriso = 'DEAT' and bltugp='') h right join
(select * from atdata.bip105 where bltspriso = 'DEAT' and bltugp<>'') u
on u.bltgs1=h.bltgs1 and u.bltgs2=h.bltgs2 and u.bltgs3=h.bltgs3 and u.bltgs4=h.bltgs4 and u.bltgs5=h.bltgs5 and u.bltgs6=u.bltgs6
)
select * from tbl_wougp
union
select * from tbl_wugp
order by bltgs1, bltgs2, bltgs3, bltgs4, bltgs5, bltgs6;
这几乎可以按预期工作,但有些行似乎加倍,我不知道为什么。
【问题讨论】:
-
请不要发布图片。不是每个人都可以访问图像转储站点。此外,如果您要发布示例输入数据,这将很有帮助。如果不了解您的出发点,就很难想象如何获得理想的结果。
-
您获得多行,因为您将所有其他列包含在分组依据中;例如,您可能需要聚合
bltgup。但是将您拉出的两行作为文本,对于 2/1/12/01/007,您有一行bltgupnull,那么您的逻辑是什么 - 将该空值文本添加到所有其他非空值 -值行的文本? -
@AlexPoole 这是一份资产负债表报告,有些账户的含义几乎相同。它们之间的区别在于一个剩余时间不到 1 年,另一个剩余时间超过 1 年,但我还需要 bltgup 为空的行
-
请编辑您的问题以充分解释逻辑。对于
bltgs5 = '007',您有三行,一为空,二为非空;您的示例输出表明您只想查看非空行,但前面带有空值。再次查看图像(!),您对bltgs5 = '021'有不同的场景,其中设置了bltgs6的几行似乎遵循该模式,但还有bltgs6和bltugp均为空的单行。那么你也想在输出中看到那一行吗?还是会发生其他事情? -
@AlexPoole 对不起这张照片。我会试着解释一下。数字(bltgs)就像类别一样工作。例如(0 表示空):“1-0-0-0-0-0 Aktiva”是最高类别,“1-1-01-0-0-0 Anlagenvermögen”是 Aktiva 的子类别,因此on.. 所以你可以在图片中看到“2-1-12-01-21-0-0 sonstige Verbindlichkeiten”包含所有行作为子类别,直到 bltgs5(第 21 号)机会,例如 22。
标签: sql oracle select string-aggregation lead