2016-09-16 34 views
0

什么是为Access编写SQL查询的方法,它将按特定标准进行分组,然后在组内按不同标准进行排序,但未使用分组?例如,假设我有一个表叫tblObjects,与列:SQL组按特定标准排序,然后按不同标准在组内进行排序

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我得到一个错误,说我想使用的命令列不是一部分聚合。如果我在查询结尾处放置了“order by”语句,它将撤消这些组以支持排序。 如何解决此限制以获得我需要的结果?

我看到我其实需要这个数,所以我甚至需要聚合?我错过了一个更简单的方法来解决这个问题吗?

回答

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 
       ); 
+0

这很好。谢谢。你能解释发生了什么,意思是,为什么它有效?令我困惑的部分是where子句中的“o.autoid = ”。 – ASignor