从具有不同条件的表中选择总和和平均值

Posted

技术标签:

【中文标题】从具有不同条件的表中选择总和和平均值【英文标题】:Select sum and average from table with different condition 【发布时间】:2020-08-16 18:23:41 【问题描述】:

我有一个 PostgreSQL 表,如屏幕截图所示

我想在同一个查询中获取以下数据

所有单位的总和 所有 unit_price 的平均值,仅当单位 > 0 时

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

我只会使用条件聚合。在 Postgres 中,使用 filter:

select sum(units),
       avg(unit_price) filter (where units > 0)
from t;

【讨论】:

【参考方案2】:

这是一种可能的方法(注意:我无权访问 PostgreSQL 来检查语法,所以我在这里提供一种伪代码而不检查它)。

SELECT SUM(UNITS)                        AS UNITS_SUM          , 
       SUM(UNIT_PRICE)/POSS_UNITS_COUNT  AS AVERAGE_UNIT_PRICE
  FROM 
   (SELECT UNITS                       AS UNITS              ,
           CASE WHEN UNITS > 0 THEN 1
                ELSE                0
           END                         AS POSS_UNITS_COUNT   ,
           CASE WHEN UNITS > 0 THEN UNIT_PRICE
                ELSE                0
           END                         AS UNIT_PRICE
    FROM Your_Table) A ;

请注意,如果您的表中没有正价格,这将产生 DIVIDE BY 0 错误(我假设这种情况不存在;如果存在,您应该使用CASE 其中 POSS_UNITS_COUNT 必须 > 0。

【讨论】:

什么会更快,这个或触发两个查询分别获取总和和平均值 显然是这个:在这里,表/索引只扫描一次,而在您的情况下,您将导致两次连续扫描。另外,请注意,外部 SELECT 从单行表(内部 SELECT)中获取其数据,因此不应将其视为 真正的选择。

以上是关于从具有不同条件的表中选择总和和平均值的主要内容,如果未能解决你的问题,请参考以下文章

从每个表中选择平均值

无法从 SQLPLUS 中的 select 语句创建的表中选择数据

根据sql中的条件从不同的表中选择一个值

选择查询和操作查询有何区别?

尝试使用 MySQL 创建具有同一表中另一列的季节至今平均值的列

Laravel - 从不同的表中获取总和并计算