如何编写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,依此类推。

要区分transactionset,您可以使用db/cr 列以及新添加的set 列。您可以识别出第 3 行是一个集合,因为它的交易类型是“C”,而交易的类型是“D”。

这里我假设您的交易只是借记,如果不是,请在问题中提供更多详细信息。希望这会有所帮助。

【讨论】:

以上是关于如何编写sql查询为每个分组记录生成一个组号的主要内容,如果未能解决你的问题,请参考以下文章

当列值更改时,如何将组号添加到 SQL Server 2012 中的顺序记录?

如何编写 sql 查询对数据集进行排序或分组

SQL:如何取得分组中某个字段为最大值的那些记录

如何显示mysql分组中时间最大的一行记录

如何编写带有数量单位转换的分组查询SQL?

使用 SQL Hana 对数据进行分组