sql - 如何在 oracle sql 查询中生成行项目编号

标签 sql oracle

这似乎应该是一个已经解决的经典发票项目问题,但也许我在搜索中没有使用正确的词。

我正在运行这样的查询(这只是一个简单的示例,我的实际查询要复杂得多,但它返回相同的结果):

select invoice.inv_num, item.name, item.qty 
 from invoice invoice, item 
 where invoice.inv_num = item.inv_num
 order by invoice.inv_num

我需要生成一个项目编号列,该列对每个项目递增,但每个新发票编号都从 1 开始。因此,例如,我需要最终结果看起来像这样:

inv_num   item_num   name            qty
-------   --------   -------------   ---
111       1          red widgets     10
111       2          blue widgets    5
222       1          green_widgets   7
222       2          red_widgets     16
222       3          black_widgets   10
333       1          blue_widgets    8
333       2          red_widgets     12

我们仍在使用 Oracle 9i,以防万一。

最佳答案

您可以使用 oracle rank 或 row_number 分析函数(取决于您希望如何处理重复/排名相同的项目)。

以下是将第 4 列 item_number 添加到查询中的方法:

select invoice.inv_num, item.name, item.qty ,
       row_number() over (partition by inv_num order by qty desc) item_num
 from invoice invoice, item 
 where invoice.inv_num = item.inv_num
 order by invoice.inv_num
  • 由于 按条款划分。
  • 在发票中,排名/项目编号由数量决定(最高 到最低)。
  • 在上面的查询中,rank 或 row_number 将给出与您的数据相同的结果。但是,如果发票中有多个具有相同数量的项目(10 个红色,10 个蓝色小部件),rank 将为您提供相同的项目编号,因此在这种情况下 row_number 是合适的。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#i81407

关于sql - 如何在 oracle sql 查询中生成行项目编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21892498/

相关文章:

java - 在hibernate数据库中没有响应

sql - 如何计算单个 SQL 中 varchar 中字符的出现次数?

java - ORA-01704 : string literal too long in oracle 10g

sql - 尝试安装 SSMS 18.4 版本时出错

sql - 如何从包含单引号的oracle数据库中搜索数据

sql - 检查字符串是否为数字的跨数据库方法

mysql - 依靠 SQL

php - 如何将此 MySQL 查询转换为 Laravel?

sql - 特殊字符的 order by 规则是什么?

SQL 查询 : How to check if a particular record had more alphabets than numbers and return that