【问题标题】:Counting all other types but the current one计算除当前类型之外的所有其他类型
【发布时间】:2010-07-23 11:37:20
【问题描述】:

我正在尝试编写此查询,它将计算除包含类型值的列之外的所有列的平均值,我将整个查询分组。

例如,对于 4 种类型,结果表中的每一列将包含所有其他三种类型值的平均值,我需要排除当前类型的行。

例如,如果我要计算每种类型的平均值,查询将如下所示:

SELECT

SUM(some value) / COUNT(TYPE)

FROM TEMPTABLE
GROUP BY TYPE

现在我正在尝试计算其他三个的总平均值。谢谢。

【问题讨论】:

  • 你确定你的意思是列,而不是行?能发一下表结构吗?

标签: sql tsql sybase sum average


【解决方案1】:

您可以执行一次查询来获取不同的类型,并 LEFT JOIN 同一张表,检查类型不等式:

SELECT t1.type,
       SUM(t2.some_value) / COUNT(t2.type)
FROM ( SELECT DISTINCT type FROM temptable ) t1
LEFT JOIN temptable t2 ON ( t1.type <> t2.type )
GROUP BY t1.type

由于您只想要平均值,因此您可以替换该行

FROM ( SELECT DISTINCT type FROM temptable ) t1

通过

FROM temptable t1

但第一个解决方案可能会执行得更好,因为行数较早减少。

【讨论】:

  • 谢谢,我想我需要写这样的东西作为嵌套查询,因为这部分只是一个巨大的 SELECT 中的一个成员。所以我不能直接使用 FROM 或 WHERE
  • 彼得的答案应该没有理由不能作为子/嵌套查询,应该有吗? (我的 Sybase 生锈了)
  • 好吧,我从总和中减去当前值,然后除以 (COUNT -1)。我没有测试你的解决方案,但看起来不错。
【解决方案2】:

这里的起点是在你的类型和你的 temptable 之间进行笛卡尔连接(猜测你的表结构是:type(id, type), valueTable(id, type_id, some_value))

以下查询

选择 t.type, SUM(vt.someValue) / COUNT (*) AS sum FROM type t, valueTable vt WHERE vt.type_id != t.id 按类型分组

应该可以解决问题。

【讨论】:

  • 谢谢,虽然我正在插入 valueTable。只是一开始的诱惑
【解决方案3】:

这能满足您的需要吗?

(可能与另一个CASE 语句一起避免除以零错误,如果有可能不返回任何类型,我也没有明确说明type 为NULL 的情况)

SELECT

SUM(CASE WHEN TYPE <> 'Type1' THEN someValue ELSE 0 END) / 
     SUM(CASE WHEN TYPE = 'Type1' THEN 1 ELSE 0 END) AS T1,

SUM(CASE WHEN TYPE <> 'Type2' THEN someValue ELSE 0 END) / 
     SUM(CASE WHEN TYPE = 'Type2' THEN 1 ELSE 0 END) AS T2,

SUM(CASE WHEN TYPE <> 'Type3' THEN someValue ELSE 0 END) / 
     SUM(CASE WHEN TYPE = 'Type3' THEN 1 ELSE 0 END) AS T3,

SUM(CASE WHEN TYPE <> 'Type4' THEN someValue ELSE 0 END) / 
     SUM(CASE WHEN TYPE = 'Type4' THEN 1 ELSE 0 END) AS T4
FROM TEMPTABLE

【讨论】:

  • thx 这实际上不是一个坏主意,但我改为从总和中减去当前值并将其除以 (COUNT -1)
【解决方案4】:

我认为你可以使用这个:

SELECT type, avg(col_01)
FROM myTable
GROUP BY type

【讨论】:

    【解决方案5】:

    也应该在 Sybase 上工作:

    SELECT
       SUM(some value) / SUM(CASE WHEN TYPE = 1 THEN 1 ELSE 0 END)
    FROM TEMPTABLE
    GROUP BY TYPE
    

    【讨论】:

    • 是的,这是真的,但查询将为每种类型执行此操作。所以我不想使用一个常数值
    猜你喜欢
    • 2016-09-10
    • 2013-08-10
    • 2021-06-24
    • 2019-02-20
    • 2012-08-24
    • 2018-09-30
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多