sql - 查询列出每个行项目但只列出总计一次

标签 sql postgresql

我们有一个从多个表中提取数据的销售报告,我的查询显示了正确的数据,但具有多个订单项的订单除外,即订单表中的总计列在每个订单项行上。

我们如何才能在订单项 ID 最小的行(对于该订单)仅列出一次订单总计,但仍然列出所有订单项行?谢谢!

数据结构:

订单表:

  • 订单号
  • 总计

行项目表:

  • 身份证
  • 订单号
  • Line_Item_Price
  • Line_Item_Qty

结果应该是:

  Order_ID   Total   Line_Item_Price   Line_item_Qty   Line_Item_ID  
 ---------- ------- ----------------- --------------- -------------- 
     10001     200               100               2          32001  
     10002     150               150               1          32002  
     10003     210                55               1          32003  
     10003                        30               2          32004  
     10003                        95               1          32005  
     10004     125               125               1          32006  

最佳答案

这应该在应用程序而不是 SQL 中完成。

但是您可以使用window functions来做到这一点

select o.order_id, 
       case row_number() over (partition by o.order_id order by line_item_id)
         when 1 then o.total
       end as total, 
       li.line_item_price,
       li.line_item_qty,
       li.line_item_id
from orders o 
  join line_item li on o.order_id = li.order_id
order by o.order_id, li.line_item_id;

row_number() 为每个订单的每个行项目分配一个唯一的行号。当数字为 1 时显示总数,否则不显示。

在关系数据库中,没有“第一行”这样的东西,除非您指定一个order by - 在这种情况下,“第一行”是具有最小的行项目line_item_id

在线示例:http://rextester.com/TQOIX50171


无关,但是:将总计存储在 orders 表中并不是一个非常好的主意。在规范化设计中,您不应存储可以轻松从现有数据中导出的信息。

关于sql - 查询列出每个行项目但只列出总计一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50923128/

相关文章:

sql - T-Sql 选择 * 30% 到 40% 之间

sql - 获取具有日期范围的自定义聚合的增量

ruby-on-rails - Rails 4.2 引擎引用列迁移失败 PG::UndefinedTable: ERROR: in postgresql

postgresql - 获取 PostgreSQL 列中所有现有值的集合

sql - 如何可靠地获取查询的 SQL_ID

mysql - SP_RENAME 不起作用

sql - 在 Postgres 和 SQL Server 中为日期添加一天

postgresql - Python SqlAlchemy : Data are inserted with NULL values instead of specified values

postgresql - 非公共(public)模式中的 Postgres 外键约束

MySqlDataAdapter SQL 语法用法