我的任务是选择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'
谢谢您的任何帮助。
答案 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
表示该年没有任何人。