Query

我只想要一個最大值,但它返回所有行

  • November 1, 2018

我需要有關此查詢的幫助。我試圖為 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

引用自:https://dba.stackexchange.com/questions/214123