0

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

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

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

SELECT

SUM(some value) / COUNT(TYPE)

FROM TEMPTABLE
GROUP BY TYPE

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

4

5 回答 5

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

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

于 2010-07-23T11:44:58.113 回答
0

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

以下查询

SELECT t.type, SUM(vt.someValue) / COUNT (*) AS sum FROM type t, valueTable vt WHERE vt.type_id != t.id GROUP BY t.type

应该做的伎俩。

于 2010-07-23T11:51:59.187 回答
0

也应该在 Sybase 上工作:

SELECT
   SUM(some value) / SUM(CASE WHEN TYPE = 1 THEN 1 ELSE 0 END)
FROM TEMPTABLE
GROUP BY TYPE
于 2010-07-23T11:55:35.077 回答
0

这会做你需要的吗?

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

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
于 2010-07-23T13:30:50.230 回答
0

我认为你可以使用这个:

SELECT type, avg(col_01)
FROM myTable
GROUP BY type
于 2010-07-23T17:11:10.473 回答