1

Access データベースに、顧客と製品に関する情報を含むテーブルがあります。

custID product price
--------------------
1   objectA   12,5
1   objectB   54,51
1   objectC   14,85
2   objectE  188,84
2   objectC   14,85
2   objectD  188,84

そのテーブルから、顧客が SQL で購入した最も高価な製品を取得したいと考えています。私はこれを試しました:

SELECT a.custID, a.product, max(a.price)
FROM orders AS a INNER JOIN orders AS b ON (a.custID=b.custID) AND (a.price<=b.price)
GROUP BY a.product, a.custID
HAVING count(*)<2;

結果は

1   objectB  54,51

最高価格が 1 回だけ発生する場合はすべて問題なく機能しますが、2 つの製品の (最高) 価格が同じ場合は失敗します。顧客ごとに結果を確実に得るにはどうすればよいですか? (顧客2のobjectDまたはobjectEによるものかどうかは気にしません)。

4

1 に答える 1

1
SELECT a.custID, MAX(a.product), MAX(a.price)
FROM orders AS a 
WHERE a.price = (select MAX(b.price) from orders b where a.custID=b.custID)
GROUP by a.custID

補足:
SQL Server 2008 のように、ウィンドウ機能をサポートするより高度な SQL サーバーを使用している場合は、代わりに次のように記述できます。

SELECT custID, product, price FROM (
    SELECT custID, product, price,  ROW_NUMBER()
        OVER (partition by custid order by price desc) AS rowNo
    FROM orders 
) AS a
WHERE a.rowNo = 1
于 2012-04-13T10:40:42.333 に答える