2012-01-25 6 views
3

は、私は、小売店の販売の最大年齢を取得しようとしていますこのクエリを、(複数の町があります)があり、同じ(最大)年齢とともに、複数の人があります場合は、複数表示されます。問題があるMSアクセス - 集約関数とmax

SELECT Linnad.Linn, Myyjad.Nimi, Max(Myyjad.Vanus) As Vanus 
FROM Linnad INNER JOIN Myyjad ON Linnad.LinnID = Myyjad.LinnID 
GROUP BY Linnad.Linn, Myyjad.Nimi 
ORDER BY Linnad.Linn; 

、MAXを無視するようで、ちょうどすべての値を示しており、私はMyyjad.Nimiでグループを削除することはできません。私は、クエリです。ここのMicrosoft Access 2010を使用していますなぜなら、Myyjad.Nimiには集計関数が含まれていないというエラーが出るからです。

、出力は次のようになります。 タウン - 名前 - マックス(年齢)

また、リン=タウン、Nimi =名前とVanus =年齢。

+1

テーブル名とカラム名を英語に翻訳した場合、実行しようとしていることを理解するのがはるかに簡単です。 –

+0

私は1つのコメントをコピーします:達成しようとしているのは、売り手の最大年齢を取得することです。同じ年齢の複数の人がいる場合は、その名前を表示します。しかし、LinnID(TownID)はそれらを別々の都市に分けていますが、同じ(最大)年齢の売り手はほとんどいません。混乱してごめんなさい。そして、ええ、私は何が必要なのか不明なことについては申し訳なく思っていますが、私はそれを得て、すべてに感謝します! :) –

+0

あなたの言語を知らずにSQL文を読むのは難しいですか? –

答えて

1

私は、これはあなたが探して何かもしれないと思う:

SELECT L.Linn, M.Nimi, M.Vanus 
FROM Linnad As L, 
(
SELECT M2.LinnID, M2.Nimi, M2.Vanus 
FROM Myyjad As M2 
WHERE M2.Vanus = (SELECT Max(Z.Vanus) FROM Myyjad As Z WHERE Z.LinnID = M2.LinnID) 
) As M 
WHERE M.LinnID = L.LinnID 

これは、サブ選択すべてNimiのが最大Vanusを示すとリンIDのリストを取得するを行い、その後、私たちはこのサブ選択をリンクLinnIDを介してLinnadテーブルに戻ります。

+0

うわー、そうだよ! :) –

+0

:)Phew、私はアクセスがときどきサブテーブルを名前付きテーブルとして使用することについて面白いかもしれないことを知っています。 –

1

私はあなたがしたいと思う:グループあたり

SELECT Linnad.Linn, Myyjad.Nimi, Myyjad.Vanus 
FROM Linnad INNER JOIN Myyjad ON Linnad.LinnID = Myyjad.LinnID 
WHERE DateValue(Myyjad.Vanus) 
     = (SELECT Max(DateValue(Myyjad.Vanus)) FROM Myyjad) 
ORDER BY Linnad.Linn 

上位N:

SELECT Linnad.Linn, Myyjad.Nimi, Myyjad.Vanus 
FROM FROM Linnad INNER JOIN Myyjad ON Linnad.LinnID = Myyjad.LinnID 
WHERE Myyjad.ID In (
    SELECT Top 1 m.ID 
    FROM Myyjad m 
    WHERE m.LinnID=Linnad.ID 
    ORDER BY m.Vanus Desc, m.ID) 
+0

それから私にはただ一つの街が示されています、それらの複数があります=/ –

+0

あなたは時間要素を持っているかもしれないと思います。私はDateValueを追加します。 – Fionnuala

+0

townIDは2つのテーブル間の関係に過ぎないので、各町の小売業者の最大年齢を表示する必要があり、日付の値はありません。年齢は単なる整数であり、年齢(68歳など)のみです。 –

1

リンによってグループ化(町)とNimi(名前は)それぞれのあなたに1つの行を与えるためにDBエンジンに指示します町と名前の組み合わせ、それらの組み合わせごとの最大バヌス(年齢)を表示します。論理的には、それはあなたが望むものではありません。その町の最大年齢と同じ年齢の各人の名前が必要です。

まず、各LinnIDの最大年齢を取得できることを確認します。

SELECT 
    LinnID, 
    Max(Vanus) As MaxOfVanus 
FROM 
    Myyjad 
GROUP BY LinnID; 

それが動作する場合、あなたはその後、Linnadで(LinnID上の)あなたがそれに参加する別のクエリでそれを使用し、「qryTownAge」として保存することができます。これにより、一致するLinnを取得することができます。

SELECT l.LinnID, l.Linn, q.MaxOfVanus 
FROM 
    Linnad AS l 
    INNER JOIN qryTownAge AS q 
    ON l.LinnID = q.LinnID 
ORDER BY l.Linn; 

これが機能する場合は、qryTownAge2として保存してください。次に、このクエリを試してください。

SELECT q.Linn, q.MaxOfVanus, m.Nimi 
FROM 
    qryTownAge2 AS q 
    INNER JOIN Myyjad AS m 
    ON (
     m.LinnID = q.LinnID 
     AND m.Vanus = q.MaxOfVanus 
     ) 
ORDER BY q.Linn; 

これがすべて機能する場合は、それをすべて行う1つのクエリを作成できます。しかし、それを段階的に行うことは、エラーを特定するのに役立ちます。

+0

お待ちください、私は試してみましょう:) –

+0

ちょうど方法intented、ありがとうたくさん動作します! :) –