从同一列

时间:2018-06-13 00:37:12

标签: sql sql-server tsql

我正在使用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

3 个答案:

答案 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