SQL 查找事务的平均值
Posted
技术标签:
【中文标题】SQL 查找事务的平均值【英文标题】:SQL finding Average for transaction 【发布时间】:2022-01-01 13:21:39 【问题描述】:所以我有一个关于平均问题的问题。假设我有 5 笔交易,每笔交易有多个项目,每个项目都有自己的数量值。我想搜索每笔交易的平均数量。请注意,在我的 ERD 设计中,有 2 个单独的表,即 HeaderTransaction 和 TransactionDetail。
如果我使用 AVG() 函数,那么它会很奇怪,例如
第一笔交易:
5 个鸡蛋 2根香肠第二笔交易:
3 个鸡蛋
10 根香肠。
AVG 会像 (5+2+3+10)/4 我想要的是 ((5+2)+(3+10))/2
我目前的解决方案是
SELECT SUM(ItemQuantity)/COUNT (DISTINCT (SalesTransactionId)) as[aveg]
我觉得有点粗糙
【问题讨论】:
我想搜索每笔交易的平均数量。Sum(items_amount)/Count(transactions)
我确实需要关键字“DISTINCT”,因为它会导致不同的答案
您是否同时使用 mysql 和 Microsoft SQL Server?如果没有,请删除无关标签。答案可能因您使用的实际 DBMS 而异。
你有一个我认为无法改进的简洁解决方案。
您知道(5+2+3+10)/4
和((5+2)+(3+10))/2
中只有除数不同?
【参考方案1】:
如果我使用 AVG() 函数,那会很奇怪
如果你 AVG 你说你想要平均的,那就不是,这是每笔交易的项目数
SELECT AVG(num_of_items_in_transaction)
FROM
(SELECT SUM(amount_of_item) as num_of_items_in_transaction FROM detail GROUP BY tran_id)
每个事务的内部查询分组,并计算项目总数。然后外部查询平均这些总数。关键是,因为您需要先按事务执行一个操作组,然后再按其他操作(整个数据集)执行另一个操作组,所以您不能将分组操作组合成一个步骤 - 它必须是多阶段的,因为您'正在将一个阶段的输出馈送到另一个阶段的输入。 SELECT AVG(SUM(amount)) .. GROUP BY ???
- 你会在???
中加入什么来让 MySQL 知道你希望 SUM 由一个事物分组,而 AVG 由另一个分组? (你不能)
如果您不开窗,通常需要将其作为两步减少,但无论如何这可能是一个隐式的多步操作
我认为没有必要更改您所拥有的(金额总和除以交易次数),我只是想指出为什么它可能没有按您的预期工作
【讨论】:
以上是关于SQL 查找事务的平均值的主要内容,如果未能解决你的问题,请参考以下文章