我需要选择在同一列中有多个记录的客户

时间:2019-05-10 09:54:20

标签: sql

我的任务是选择2017年和2018年(而非2019年)旅行的所有客户。

我已经尝试了以下类似方法,但是它不起作用。我几乎是SQL的新手,而VBA更是我的事。

我可以说旅行日期少于2019年1月1日,但这可能只会导致预订了2019年之前一次旅行的客户,我需要选择2017年至少旅行一次的人,然后在2018年至少一次,但在2019年至少一次。

select clientid from cust

    where tour_date between '2017-01-01' and '2017-12-31'
    and tour_date between '2018-01-01' and '2018-12-31'
    and tour_date < '2019-01-01'

谢谢您的任何帮助。

4 个答案:

答案 0 :(得分:4)

使用存在和不存在的相关子查询

select clientid from cust a
where exist
  (select 1 from cust b where a.clientid=b.clientid and tour_date  between '2017-01-01' and '2017-12-31')
and exist 
  (select 1 from cust b where a.clientid=b.clientid and tour_date  between '2018-01-01' and '2018-12-31')
and not exists
   (select 1 from cust b where a.clientid=b.clientid and tour_date  between '2019-01-01' and '2019-12-31')

答案 1 :(得分:1)

我们也可以尝试在此处使用聚合:

SELECT clientid
FROM cust
GROUP BY clientid
HAVING
    COUNT(CASE WHEN tour_date BETWEEN '2017-01-01' AND '2017-12-31' THEN 1 END) > 0 AND
    COUNT(CASE WHEN tour_date BETWEEN '2018-01-01' AND '2018-12-31' THEN 1 END) > 0 AND
    COUNT(CASE WHEN tour_date < '2019-01-01' THEN 1 END) > 0;

答案 2 :(得分:1)

试试这个-

SELECT clientid
FROM
(
    SELECT clientid,YEAR(tour_date) YR
    FROM cust
    WHERE YEAR(tour_date) IN (2017,2018)
)A
GROUP BY clientid
HAVING COUNT(DISTINCT YR) > 1

答案 3 :(得分:0)

如果您希望客户而不是他们的行程详细信息,请使用汇总。我可以这样说:

SELECT clientid
FROM cust
GROUP BY clientid
HAVING SUM(CASE WHEN tour_date >= '2017-01-01' AND tour_date < '2018-01-01' THEN 1 END) > 0 AND
       SUM(CASE WHEN tour_date >= '2018-01-01' AND tour_date < '2019-01-01' THEN 1 END) > 0 AND
       SUM(CASE WHEN tour_date >= '2019-01-01' AND tour_date < '2020-01-01' THEN 1 END) = 0 ;

HAVING子句中的每个条件都在计算相关年份的旅行次数。比较> 0表示至少有一个; = 0表示该年没有任何人。