我们有一个从多个表中提取数据的销售报告,我的查询显示了正确的数据,但具有多个订单项的订单除外,即订单表中的总计列在每个订单项行上。
我们如何才能在订单项 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/