【问题标题】:Average in order by clause按子句排序的平均值
【发布时间】:2011-10-24 20:53:58
【问题描述】:

我有这个问题:

SELECT 
   Field1
   AVG(Field2) as Field2, 
   AVG(Field3) as Field3, 
   AVG(Field4) as Field4 
FROM Table1
GROUP BY Field1
ORDER BY Field2 DESC, Field3 DESC, Field4 DESC

如何(如果可能)用三个字段的平均值排序? 我想在获得三个字段的平均值后下一个订单。例如:

...
ORDER BY (Field2 + Field3 + Field4) / 3

【问题讨论】:

  • 订购什么?您的查询只返回一行。
  • 在任何字段中都可以为 null 吗?你想如何处理这些?

标签: sql-server tsql sql-order-by


【解决方案1】:

要对 Field1 + Field2 + Field3 的平均值进行排序,您可以添加一个新字段并对其进行排序。

select Field1,   
       avg(Field2) as AField2, 
       avg(Field3) as AField3, 
       avg(Field4) as AField4,
       avg(Field2+Field3+Field4) as Sort
from Table1
group by Field1
order by Sort desc

或者您可以将查询放在子查询中,并根据外部查询中字段的总和进行排序。

select T.Field1,
       T.AField2,
       T.AField3,
       T.AField4
from (select Field1,   
             avg(Field2) as AField2, 
             avg(Field3) as AField3, 
             avg(Field4) as AField4
      from Table1
      group by Field1) as T
order by T.AField2 + T.AField3 + T.AField4 desc

【讨论】:

    【解决方案2】:
    SELECT 
       AVG(Field1) as AvgField1, 
       AVG(Field2) as AvgField2, 
       AVG(Field3) as AvgField3 
    FROM Table1
       ORDER BY AvgField1 DESC, AvgField2 DESC, AvgField3 DESC
    

    或者:

    SELECT 
       AVG(Field1) as Field1, 
       AVG(Field2) as Field2, 
       AVG(Field3) as Field3 
    FROM Table1
       ORDER BY AVG(Field1) DESC, AVG(Field2) DESC, AVG(Field3) DESC
    

    【讨论】:

    • 感谢@sllev 的反馈。这是针对两个查询还是仅针对其中一个?您是否有参考资料说明为什么会出现重大问题以便我进行研究?
    • 我认为@sllev 认为您的第二个查询将运行聚合两次,这是不正确的。
    • @JNK:我假设 order by 将为每一列再计算一次 AVG,只是可以纠正自己这不是一个重大问题。我应该记得我的评论,我错了,因为 ORDER BY 适用于最终选择数据集,这将是每列简单的单个整数,因此根本没有 AVG 计算
    • 刚刚删除了我的推荐并意识到这可能会使 JNK 评论的访问者感到困惑,因为现在看起来他正在谈论这个特定的答案,我该如何恢复原始评论或如何纠正这种情况?跨度>
    • 我也删除了我的评论,所以我们回到了我们现在开始的地方。
    【解决方案3】:
    ;WITH Input(Field1, Field2, Field3)
    AS
    (
    SELECT     
          AVG(Field1) as Field1,     
          AVG(Field2) as Field2,     
          AVG(Field3) as Field3  
        FROM Table1    
    )
    SELECT Field1, Field2, Field3 
    FROM Input    
    ORDER BY Field1 DESC, Field2 DESC, Field3 DESC 
    

    【讨论】:

    • 好的,但是我想在获得三个字段的平均值后下单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多