我正在尝试编写此查询,它将计算除包含类型值的列之外的所有列的平均值,我将整个查询分组。
因此,例如,对于 4 种类型,结果表中的每一列都将包含所有其他三种类型值的平均值,我需要排除当前类型的行。
例如,如果我要为自己计算每种类型的平均值,查询将如下所示:
SELECT
SUM(some value) / COUNT(TYPE)
FROM TEMPTABLE
GROUP BY TYPE
现在我正在尝试计算其他三个的总平均值。谢谢。
您可以执行一个查询来获取不同的类型和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
但是第一个解决方案可能会执行得更好,因为行数减少得更早。
这里的起点是在您的类型和您的 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
应该做的伎俩。
也应该在 Sybase 上工作:
SELECT
SUM(some value) / SUM(CASE WHEN TYPE = 1 THEN 1 ELSE 0 END)
FROM TEMPTABLE
GROUP BY TYPE
这会做你需要的吗?
(可能使用另一个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
我认为你可以使用这个:
SELECT type, avg(col_01)
FROM myTable
GROUP BY type