代码之家  ›  专栏  ›  技术社区  ›  Halo

计算除当前类型以外的所有其他类型

  •  0
  • Halo  · 技术社区  · 14 年前

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

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

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

    SELECT
    
    SUM(some value) / COUNT(TYPE)
    
    FROM TEMPTABLE
    GROUP BY TYPE
    

    现在我要计算另外三个的总平均值。谢谢。

    5 回复  |  直到 14 年前
        1
  •  1
  •   Peter Lang    14 年前

    您可以执行一个查询来获取不同的类型,然后 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
    

        2
  •  0
  •   Killerwhile    14 年前

    这里的出发点是在您的类型和您的表之间建立一个笛卡尔连接(假设您的表结构是:type(id,type),valueTable(id,type,id,some\ u value))

    将(*)计数为t型的和, valueTable vt其中vt.type\u id!=t、 身份证

    应该会成功的。

        3
  •  0
  •   Martin Smith    14 年前

    这能满足你的需要吗?

    CASE 语句以避免被零除的错误如果有可能任何类型都不会返回,我也没有明确说明 type (为空)

    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
    
        4
  •  0
  •   Jamie LaMorgese    14 年前

    SELECT type, avg(col_01)
    FROM myTable
    GROUP BY type
    
        5
  •  0
  •   Tim Cooper    13 年前

    也应该在Sybase上工作:

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