2013-01-18 135 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它在原始查询中没有任何意义。 –