2016-09-16 9 views
0

特定の基準でグループ化するAccessのSQLクエリを作成し、使用されなかった異なる条件グループ化するには?私は色を繰り返さないオブジェクトのリストで終わるしたい特定の基準でSQLグループを作成し、グループ内で異なる条件で注文する

autoID name color shape weight height

、それは各色グループで最も高いオブジェクトを選択:たとえば、列で、私はテーブルと呼ばれるtblObjectsがあるとします。同じ色、同じ高さのオブジェクトがある場合は、最も重いものを選択します。

私は色でグループ化し、高さでグループ内を順序付けし、次に重みをつけて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; 

私はちょうど列がどこから来たについての曖昧さを取り除くために、テーブルの別名を追加しました。

EDIT:

うーん、私はあなたがこれをしたいと思う:

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

関連する問題