Sql 从同一列中检索相似的值

Sql 从同一列中检索相似的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我使用的是MS SQL Server,有一个数据库表,其中包含客户联系信息、购买的汽车以及出售汽车的人。我需要知道客户的姓名,但前提是他们购买了一辆同年至少有30人购买的汽车。我可以获得客户联系信息和汽车信息,但我在试图找出如何仅返回至少30人购买的汽车的结果时遇到了困难 汽车销售表中的特定列为客户优先、客户最后、客户电子邮件、销售人员第一、销售人员最后、汽车型号id car\u model\u id列包含诸如“5826”、“7256”等值。。。因此,我只需要在列中出现“5826”至少30次的情

我使用的是MS SQL Server,有一个数据库表,其中包含客户联系信息、购买的汽车以及出售汽车的人。我需要知道客户的姓名,但前提是他们购买了一辆同年至少有30人购买的汽车。我可以获得客户联系信息和汽车信息,但我在试图找出如何仅返回至少30人购买的汽车的结果时遇到了困难

汽车销售表中的特定列为客户优先、客户最后、客户电子邮件、销售人员第一、销售人员最后、汽车型号id

car\u model\u 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
这里有一个使用exists的选项:

或者,由于您使用的是sql server,因此可以使用窗口函数:


这里有一个使用子查询的选项

选择汽车销售。*, 汽车销量30辆。总销量 来自汽车销售部 参加 选择车型id作为cmi, 将汽车型号id计算为总销量 来自汽车销售部 按车型识别号分组为车型识别号 如果total_sales>=30我最喜欢sgeddes窗口函数的答案并投了赞成票,但我想发布两个备选答案。我认为这些答案不如窗口函数答案好,但我个人觉得它们比现有答案更具可读性

尽管我认为DB将足够聪明,可以将其视为与现有版本相同的版本,但我认为在概念上更简单的设想是,在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

添加模型id作为where条件请阅读一些关于改进问题的提示。谢谢。你的第一个问题就是我要找的。我遇到了一个问题,但当有重复的记录,例如,如果有人买了2辆车,他们出现在30辆车的输出两次。我一直在试图找出如何过滤结果,以便只返回1个客户联系人,而distinct似乎出于某种原因不起作用。为了避免重复的客户,您可以在这两个查询中使用原始问题中的select子句。选择不同的客户优先、客户最后、客户电子邮件。您不能使用DISTINCT*来避免重复客户信息,因为销售人员和型号可能不一样。
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