SQL组按一定的标准,然后按不同的标准在组内部排序

时间:2016-09-16 00:31:46

标签: sql ms-access aggregate-functions

为Access编写SQL查询的方法是什么,该查询将按特定标准进行分组,然后按照不同的标准在组内部排序,而不是用于分组?例如,假设我有一个名为tblObjects的表,其中包含列:

autoID name color shape weight height

我希望最终得到一个不重复颜色的对象列表,并选择每个颜色组中最高的对象。如果有相同颜色,相同高度的物体,则选择最重的物体。

我想我可以按颜色分组,按照高度然后按重量排在组内,然后截断为1.这应该消除所有颜色重复并选择一个"代表"根据我的标准,每种颜色。

在这里研究之后,我能够将代码分组:

    SELECT autoID,  name,  color,  shape,  weight,  height
    FROM tblObjects INNER JOIN( SELECT
         color, COUNT(*) AS NumberSameColor
         FROM tblObjects
         GROUP BY color) AS tblGroups ON tblObjects.color = tblGroups.color;  

但是当我尝试ORDER BY height, weight时,我收到一条错误消息,指出我尝试用来排序的列不是聚合的一部分。如果我按"顺序排列"在查询结束时的语句,它撤消了有利于排序的组。 如何解决这个限制以获得我需要的结果?

我发现我实际上并不需要计数,所以我甚至需要汇总吗?我错过了一种更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

这应该有效:

SELECT o.autoID,  o.name,  o.color,  o.shape,  o.weight, o.height,
       c.NumberSameColor -- added so the `JOIN` makes sense
FROM tblObjects as o INNER JOIN
     (SELECT color, COUNT(*) AS NumberSameColor
      FROM tblObjects
      GROUP BY color
     ) AS c
     ON o.color = c.color
ORDER BY o.weight, o.height;

我刚刚添加了表别名,以消除关于列来自何处的歧义。

编辑:

嗯,我想你想要这个:

select o.*
from tblObjects as o
where o.height = (select max(o2.height)
                  from tblObjects as o2
                  where o2.color = o.color
                 );

根本没有group by。这表示选择高度为其颜色的最大值的所有对象。当然,给定颜色可能不止一个。为此:

select o.*
from tblObjects as o
where o.autoid = (select top 1 o2.autoid
                  from tblObjects as o2
                  where o2.color = o.color
                  order by o2.height desc, o2.weight desc, o2.autoid
                 );