我正在使用MS SQL Server,并且有一个数据库表,其中包含客户联系信息,购买的汽车以及售卖汽车的人。我需要得到顾客的名字,但前提是他们买了一辆至少有30人在同一年购买的汽车。我可以获得客户联系信息和汽车信息,但我无法弄清楚如何仅为至少30人购买的汽车返回结果。
Car_sales表中的特定列为customer_first, customer_last, customer_email, salesperson_first, salesperson_last, car_model_id
car_model_id列包含'5826','7256'等值...所以我只需要在'5826'在列中出现至少30次的情况下获取客户信息。
这是我开始使用的,但它死了不会返回所需的结果。我不太确定如何返回购买与其他30人相同的汽车的客户信息。
SELECT DISTINCT customer_first, customer_last, customer_email
FROM Car_sales
GROUP BY customer_first, customer_last, customer_email
HAVING COUNT(car_model_id) >= 30
答案 0 :(得分:2)
以下是使用exists
的一个选项:
select *
from car_sales cs1
where exists (
select 1
from car_sales cs2
where cs1.car_model_id = cs2.car_model_id
group by cs2.car_model_id
having count(*) >= 30
)
或者,由于您使用的是sql server
,因此您可以使用window function
:
select *
from (select *, count(*) over (partition by car_model_id) cnt
from car_sales) t
where cnt >= 30
答案 1 :(得分:0)
以下是使用子查询的选项。
SELECT car_sales.* ,
car_sales_thirty.total_sales
FROM car_sales
JOIN
(SELECT car_model_id AS cmi,
COUNT(car_model_id) AS total_sales
FROM car_sales
GROUP BY car_model_id) AS car_sales_thirty ON car_sales_thirty.cmi = car_sales.car_model_id
WHERE total_sales >= 30
答案 2 :(得分:0)
我喜欢sgeddes window function
回答最好的并投票赞成它,但我想发布两个替代答案。我不认为这些问题与window function
答案一样好,但我个人认为它们比exists
答案更具可读性。
尽管我认为数据库足够聪明,可以像exists
那样对待它,但我认为概念上更简单的想象一下这个in
版本在where子句中运行一个查询与许多人相反:
select distinct customer_first, customer_last, customer_email
from car_sales cs1
where cs1.car_model_id IN (
select cs2.car_model_id
from car_sales cs2
group by cs2.car_model_id
having count(*) >= 30
)
我也认为做一个简单的计数非常清楚:
select distinct customer_first, customer_last, customer_email
from car_sales cs1
where (select count(*) from car_sales cs2 WHERE cs2.car_model_id = cs1.car_model_id) >= 30