2013-01-18 133 views
1

我有兩個表:Customer和ParkingTransaction。我想向最常使用該地段的前10名顧客展示。 ParkingTrasaction表中的'CustomerKey'是將ParkingTransaction連接到客戶的FK。我寫了下面的代碼計算在ParkingTransaction表中最常用的CustomerKey,它工作正常...在表中重複計算名稱

SELECT TOP 10 CustomerKey 
, count(*) as 'Usage' 
    FROM ParkingTransaction 
    GROUP BY CustomerKey 
    HAVING (count(CustomerKey) > 0) 
    ORDER BY 'Usage' DESC 

這是我的輸出

Output

我現在面臨的問題是這個:我想從Customer表中拉出FirstName和LastName字段,而不是僅僅通過CustomerKey進行排序。我已經搞亂了JOINS,但還沒有提出解決方案。

謝謝!

+0

'HAVING(計數(CustomerKey)> 0)'是多餘的。您通過'CustomerKey'進行分組,因此每個組將至少包含1行。它不能是0或更少。 –

+0

MySQL什麼時候開始支持SQL Server風格的'SELECT TOP n ...'? (哎呀,這是個問題,而不是評論。) – spencer7593

回答

1

MySQL使用LIMIT而不是TOP

SELECT a.FirstName, a.LastName, 
     COUNT(*) as `Usage` 
FROM Customer a 
     INNER JOIN ParkingTransaction b 
      ON a.CustomerKey = b.CustomerKey 
GROUP BY a.FirstName, a.LastName 
ORDER BY `Usage` DESC 
LIMIT 10 

由於查詢使用INNER JOINHAVING COUNT(*) > 0是在這種情況下不必要的。

+0

OP:請注意,沒有匹配客戶的停車交易將不會退回(INNER JOIN)。完美的,如果這就是你要去的。 – showdev

+0

@showdev是的。但在最初的查詢中,OP使用'HAVING(count(CustomerKey)> 0)'來篩選沒有交易的客戶。 –

+0

是的。但關於沒有匹配客戶的交易(例如客戶被刪除但交易仍然存在)的情況如何。我個人更希望看到一個客戶有0個交易,並且看到一個交易有一個未知客戶,而不是看不到交易,沒有關聯的客戶。不過,優先事項。幹得好+1 – showdev

1

這裏有一種方法:

SELECT CustomerKey, c.firstname, c.lastname, count(*) as 'Usage' 
FROM ParkingTransaction pt join 
    customer c 
    on pt.customerkey = c.customerkey 
GROUP BY pt.CustomerKey, c.firstname, c.lastname, 
ORDER BY 'Usage' DESC 
limit 10 
+0

請在發帖前仔細檢查語法:) – Walter

+1

還有一件事,查詢中的having子句沒有意義,因爲inner join不顯示雙方都不存在的記錄。 – Walter

+1

@Be Happy它在原始查詢中沒有任何意義。 –