Query
我只想要一個最大值,但它返回所有行
我需要有關此查詢的幫助。我試圖為 2018 年每個月花費最多但不起作用的客戶獲得價值:
PROMPT 'Customer that has Spent the Most on Specific Month' ACCEPT MonthInput Varchar PROMPT 'Month Value:' SELECT E.cust_name, E.cust_ID, MAX(P.total_amount) FROM customer E, room_booking RB, payment P, booking_details B WHERE P.booking_id = RB.booking_id AND RB.cust_id = E.cust_id AND B.booking_id = RB.booking_id AND B.check_in_date LIKE'%-&MonthInput-2018%' GROUP BY E.cust_name, E.cust_ID
我的桌子:
Customers ( cust_name, cust_ID ) room_booking ( booking_ID, cust_ID* ) booking_details ( booking_ID* ) payment ( booking_ID* )
它返回許多行,因為 MAX 函式遍歷每個組(每個客戶,因為您已將結果 pr 客戶分組),並且對於每個客戶,它找到 MAX P.total_amount。我不知道您的數據看起來如何,但如果每個客戶真的只有一個 P.total_amount,它只會列印每個客戶 P.total_amount。
你可能想要的是這樣的:
SELECT TOP 1 E.cust_name, E.cust_ID, MAX(P.total_amount) FROM customer E, room_booking RB, payment P, booking_details B WHERE P.booking_id = RB.booking_id AND RB.cust_id = E.cust_id AND B.booking_id = RB.booking_id AND B.check_in_date LIKE'%-&MonthInput-2018%' GROUP BY E.cust_name, E.cust_ID ORDER BY MAX(P.total_amount) DESC;
我們在這裡所做的與您的原始查詢相同,但我們按總金額對列表進行排序,並且只選擇第一行,它必須是價值最高的客戶。
如果繼續我的假設,每個客戶每月只有一個 P.total_amount,那麼甚至可能不需要分組:
SELECT TOP 1 E.cust_name, E.cust_ID, P.total_amount FROM customer E, room_booking RB, payment P, booking_details B WHERE P.booking_id = RB.booking_id AND RB.cust_id = E.cust_id AND B.booking_id = RB.booking_id AND B.check_in_date LIKE'%-&MonthInput-2018%' ORDER BY P.total_amount DESC;
請注意,並非所有 DBMS 系統都支持該
TOP
語法。SQL Server 可以。其他系統如 Postgres 或 MYSQL 使用LIMIT
類似的效果。一些 DBMS 還支持標準語法OFFSET 0 ROWS FETCH FIRST 1 ROWS ONLY
(SQL Server 2012+、Postgres、Oracle 12)參見維基百科:
SELECT
(SQL):限制結果行
也許你只是錯過了一個
HAVING
條款?... GROUP BY E.cust_name, E.cust_ID HAVING P.total_amount = MAX(P.total_amount) ...
但我也建議使用顯式
INNER JOIN ... ON ...
語法而不是隱式語法重寫查詢。例如,而不是:
SELECT * FROM t1, t2 WHERE t1.c1 = t2.c2
…顯式連接將顯示為:
SELECT * FROM t1 INNER JOIN t2 ON t1.c1 = t2.c2