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 查找事务的平均值的主要内容,如果未能解决你的问题,请参考以下文章

查找SQL json列中值平均值的多列平均值

如何使用 SQL 从字典查找值中获取平均值?

在SQL中查找每个组对应的第N个值和平均值

SQL - 查找0到人口平均值之间的百分比

在 SQL 中选择日期之间的平均差异

使用滞后函数在 SQL 中查找移动平均线