2

名前、アイテム、タイプ、およびアイテムごとのカウントを含むテーブルがあります。各タイプでMAXカウントを持つ名前を判別する方法を見つける必要があります。

表の例:

---------------------------------------
| name | item     | type      | count |
| ------------------------------------|
| Dave | carrot   | vegetable | 2     |
| Dave | broccoli | vegetable | 3     |
| Tom  | spinach  | vegetable | 2     |
| Jon  | swiss    | cheese    | 3     |
| Mark | cheddar  | cheese    | 5     |
| Jon  | cheddar  | cheese    | 6     |
| Tony | onion    | vegetable | 3     |

それぞれのタイプでSUM(count)が最も高い人の名前を見つけたいです。これは私の期待される結果です:

----------------------------
| name | type      | count |
| -------------------------|
| Dave | vegetable | 5     |
| Jon  | cheese    | 9     |

すべての名前をクエリして手動でMAXを計算する以外に、洗練された方法があるかどうかを確認しようとしています。

4

3 に答える 3

3

これは最適ではないかもしれませんが、非常に簡単です。

SELECT name, type, MAX(count) as count FROM (
   SELECT name, type, SUM(count) as count
    FROM mytable
    GROUP BY type, name
) as rank
GROUP BY type;

内部クエリは、次のように、各名前とその名前のタイプの合計を返します。

NAME    TYPE    COUNT
Jon     cheese      9
Dave    vegetable   5
Mark    cheese      5
Tony    vegetable   3
Tom     vegetable   2

次に、外部クエリはタイプごとにグループ化されるため、タイプごとに1つの名前のみが返され、max()を持つとタイプのトップ名が返されます。

これはタイの名前を返しませんが、異なるタイプの同じ名前を返します。したがって、突然スイスでデイブ10を与えた場合、彼は野菜とチーズのトップとして表示されます。

于 2012-04-20T06:48:47.533 に答える
2

まず、名前とカテゴリの組み合わせごとに合計を計算します。これは、サブクエリまたはビューのいずれかで行います。コードの膨張を減らすためにビューを選択します。これは、複数回必要になるためです。

CREATE VIEW totals AS
SELECT name, type, SUM(count) AS count
FROM yourtable
GROUP BY name, type
----------------------------
| 名前| タイプ| カウント|
| ------------------------- |
| デイブ| 野菜| 5 |
| トニー| 野菜| 3 |
| トム| 野菜| 2 |
| ジョン| チーズ| 9 |
| マーク| チーズ| 5 |
----------------------------

次に、各タイプの最大数を見つける必要があります。

SELECT type, MAX(count) AS max_count
FROM totals
GROUP BY type
-------------------------
| タイプ| max_count |
| -----------------------
| 野菜| 5 |
| チーズ| 9 |
-------------------------

totalsここで、(type、count)が2番目の結果セットのペアのいずれかに等しいすべての行についてビューをクエリする必要があります。私はすでにあなたのためにほとんどの仕事をしました。私はそれを終わらせるためにあなたに任せます。

于 2012-04-20T06:27:45.267 に答える
0

私の前にデータベースを置かずに、これを試してみてください。

SELECT * FROM Table T 
  LEFT JOIN (SELECT type, MAX(count) AS max FROM Table GROUP BY type) AS maxType 
  ON T.type = maxType.type 
    AND t.count = max.count
于 2012-04-19T22:17:10.437 に答える