如何编写sql查询为每个分组记录生成一个组号
Posted
技术标签:
【中文标题】如何编写sql查询为每个分组记录生成一个组号【英文标题】:How to write sql query to generate a group no for each grouped record 【发布时间】:2016-12-14 05:46:57 【问题描述】:以下是场景:
我有以下格式的数据:
entryid , ac_no, db/cr, amt
-----------------------------------------------
1 10 D 5
1 11 C 5
2 01 D 8
2 11 C 8
3 12 D 10
3 13 C 10
4 14 D 5
4 16 C 5
5 14 D 2
5 17 C 2
6 14 D 3
6 18 C 3
我想要以下格式的数据:
到目前为止,我已经通过查询获得了前 3 列
select wm_concat(entryid),ac_no,db_cr,Sum(amt) from t1 group by ac_no,db_cr
wm_Concat(entryid),ac_no, db/cr, Sum(amt), set_id
------------------------------------------------
1 10 D 5 S1
2 01 D 8 S1
1,2 11 C 13 S1
3 12 D 10 S2
3 13 C 10 S2
4,5,6 14 D 10 S3
4 16 C 5 S3
5 17 C 2 S3
6 18 C 3 S3
I want an additional column `set_id` that either shows this S1, S2.. or any number 1,2.. so that the debit & credit entries sets can be identified.
我正在根据 Ac_no 值制作一组借方和贷方分录。 任何一点帮助都将受到高度赞赏。谢谢
【问题讨论】:
我不明白这里的动机。这里的主键是什么?为什么要将它们分组? @Pramod 的动机是,在 gui 中连同复选框一起向用户显示结果时,如果用户想要取消选择借方条目,则可以从该集合的总贷方条目中扣除相应的金额。没有主键,因为输出是查询的结果,但是我们可以使用 row_number.. 对记录进行编号。 考虑到查询,我认为这些结果没有意义 - 为什么你有两行 ac_no = 0000 和 db/cr = D?当然,您最终应该只有一个吗? (1256, D) 相同。另外,您为什么要使用 wm_concat,这是一个未记录且不受支持的功能。如果你在 11g 或以上,你应该使用 LISTAGG 【参考方案1】:创建一个新列 set
并为特定集合提供唯一标识符。因此,例如前三个记录将设置 id S1,接下来的两个将设置 S2,依此类推。
要区分transaction
和set
,您可以使用db/cr
列以及新添加的set
列。您可以识别出第 3 行是一个集合,因为它的交易类型是“C”,而交易的类型是“D”。
这里我假设您的交易只是借记,如果不是,请在问题中提供更多详细信息。希望这会有所帮助。
【讨论】:
以上是关于如何编写sql查询为每个分组记录生成一个组号的主要内容,如果未能解决你的问题,请参考以下文章