2015-11-01 69 views
0

我有两个表,customerspurchasesPurchases具有total_price列和涉及customers.cid的外键cid。我需要选择购买成本最高的客户(来)。SQL查询找到最大价格购买的名称?

我想这

select 
    cname 
from 
    customers c 
where exists 
    (select pid 
    from purchases p 
    where total_price in (select max(total_price) 
          from purchases p 
          where max(total_price) = total_price 
          and p.cid = c.cid)) 

我得到的错误,组的功能在这里不允许使用 - >

where max(total_price) = total_price 

请帮我

+0

哪个RDBMS是这个呢?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –

回答

1

你可以只总结为每一个客户的总数,然后由最高总计像这样责令:

select cname, sum(total_price) as totals 
from customers c 
inner join purchases p 
    on c.cid = p.cid 
group by cname 
order by totals desc 
limit 1 

下面是用一个例子MySQL数据库:http://sqlfiddle.com/#!9/133fa/1

我与甲骨文在这里一个例子:http://sqlfiddle.com/#!4/9d786/4

with 
totals as 
(
    select cid, sum(total_price) as totals 
    from purchases 
    group by cid 
), 
highest as (
    select max(totals) as highest from totals 
) 
select cname 
from customers c 
inner join totals t on c.cid = t.cid 
inner join highest h on t.totals = h.highest 
+0

“限制1”= sqlite语法? –

+1

由于OP没有提及使用的数据库服务器,我选择使用sqlite,MySQL,PostgreSQL等支持的'limit'。如果数据库不支持限制,OP可以即兴使用此答案。 – zedfoxus

+0

它是说限制1的错误,sql命令没有正确结束。它会给我多个相同的最高total_price值吗? –

0

要选择与名称前10名“total_price”输入(假设您正在使用Microsoft SQL Server - 其他SQL服务器提供与“top”类似的功能):

SELECT TOP 10 cname FROM customers c 
INNER JOIN purchases p on c.cid = p.cid 
order by p.total_price DESC 

你想要的任何数量的替换“10”,并采取关心其在加入和顺序colums指标,如果你有大量的数据...

如果你有超过10个客户端使用相同的total_price你不会看到他们全部。

-----------编辑:查看所有客户的情况下超过客户的total_price最高(但不重复一个客户,如果他有两个采购具有相同[最高] total_price :-----------

SELECT DISTINCT cname FROM customers c 
INNER JOIN purchases p ON c.cid = p.cid 
WHERE p.total_price = 
(SELECT MAX(p2.total_price) FROM purchases p2) 
+0

我只需要具有最高购买(total_price)价值的客户的名称。 –

+0

只有你最好的客户?然后使用“top 1”...但事实上:如果几个客户的total_price相同,您将只获得第一个,我想您会看到所有这些...! –

+0

我试过SELECT TOP 1 cname FROM customers c INNER JOIN购买p上的c.cid = p.cid order by p.total_price DESC,但它给出一个错误“FROM keyword not found where expected”。是的,如果他们有相同的total_price,我需要查看他们全部 –

1

您也可以存储在temporaly表中的每个客户最高购买(在SQL Server,例如):

SELECT c.cid, cname, max(total_price) as total 
into #temp_customers_highest_purchase 
FROM customers c 
JOIN purchases p on c.cid = p.cid 
group by c.cid, cname 

之后您可以选择total_price最高的客户:

select cname, total 
from #temp_customers_highest_purchase tmp 
join customer c on c.cid = tmp.cid 

此方法可以提高效率,因为您没有使用子查询。

如果您不使用SQL Server,您可以尝试使用WITH clausule,这对性能非常有帮助。

WITH subquery AS (
    SELECT c.cid, cname, max(total_price) as total 
    FROM customers c 
    JOIN purchases p on c.cid = p.cid 
    group by c.cid, cname) 
SELECT total from subquery sb WHERE sb.cid = 'id you want' 
+0

我在unix服务器上使用oracle,我试图在#temporary_table中存储值,它显示#是无效字符,是否需要在执行此操作之前通过temporary_table的名称创建一个新表或将通过执行您提到的查询自动创建临时表? –

+0

SQL Server自动创建#temp_customers_highest_purchase ...我不知道Oracle是否可以...无论如何,您可以尝试创建临时表或仅使用WITH查询... –

0
select 
    Name, 
    (select sum(total_price) from purchases where cid=customers.cid) as HighestTotalPrice 
from 
    customers 
相关问题