Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我需要选择在一列中有多个记录的客户_Sql - Fatal编程技术网

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

Sql 我需要选择在一列中有多个记录的客户,sql,Sql,我的任务是选择在2017年和2018年旅行过的所有客户,但不是2019年 我试过下面这样的方法,但不起作用。我几乎是SQL的新手,VBA更适合我 我可以说,如果旅行日期小于2019-01-01,但这可能只会导致客户在2019年之前预订了一次旅行,我需要选择2017年至少旅行一次,2018年至少旅行一次的人,但不是2019年 select clientid from cust where tour_date between '2017-01-01' and '2017-12-31'

我的任务是选择在2017年和2018年旅行过的所有客户,但不是2019年

我试过下面这样的方法,但不起作用。我几乎是SQL的新手,VBA更适合我

我可以说,如果旅行日期小于2019-01-01,但这可能只会导致客户在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'
从客户机中选择clientid
其中,tour_日期介于“2017-01-01”和“2017-12-31”之间
以及“2018-01-01”和“2018-12-31”之间的巡演日期
和巡演日期<'2019-01-01'

如有任何帮助,将不胜感激。

将相关子查询与exists和not exists一起使用

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')

将相关子查询与exists和not exists一起使用

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')

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

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;
选择clientid
来自卡斯特
按客户分组
有
计数(如果巡演日期介于“2017-01-01”和“2017-12-31”之间,则为1结束)>0和
计数(如果巡演日期介于“2018-01-01”和“2018-12-31”之间,则为1结束)>0和
计数(当巡演日期<'2019-01-01'然后结束时的情况)>0;

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

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;
选择clientid
来自卡斯特
按客户分组
有
计数(如果巡演日期介于“2017-01-01”和“2017-12-31”之间,则为1结束)>0和
计数(如果巡演日期介于“2018-01-01”和“2018-12-31”之间,则为1结束)>0和
计数(当巡演日期<'2019-01-01'然后结束时的情况)>0;
试试这个-

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
试试这个-

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

如果您想要客户机而不是他们旅行的详细信息,那么使用聚合。我想这样说:

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 ;
选择clientid
来自卡斯特
按客户分组
总金额(当巡演日期>='2017-01-01'和巡演日期<'2018-01-01'时,则1结束)>0,且
总和(当巡演日期>='2018-01-01'和巡演日期<'2019-01-01'然后1结束时的情况)>0和
总和(当巡演日期>='2019-01-01'和巡演日期<'2020-01-01'时,则1结束)=0;

HAVING
条款中的每一个条件都在计算所涉年份的旅行次数。比较
>0
表示至少有一个;
=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 ;
选择clientid
来自卡斯特
按客户分组
总金额(当巡演日期>='2017-01-01'和巡演日期<'2018-01-01'时,则1结束)>0,且
总和(当巡演日期>='2018-01-01'和巡演日期<'2019-01-01'然后1结束时的情况)>0和
总和(当巡演日期>='2019-01-01'和巡演日期<'2020-01-01'时,则1结束)=0;

HAVING
条款中的每一个条件都在计算所涉年份的旅行次数。比较
>0
表示至少有一个;
=0
表示在这一年中没有任何列。

这一项非常有效,谢谢-有没有办法向查询中添加更多列?谢谢例如,cust中的每一行都有客户ID、他们的预订参考、产品代码等。我希望在一列中看到客户ID,在下一列中看到产品代码“left(tourno,1)as tourno”编辑:nevermind,对其进行排序。助教!这是一个有点开放性的问题,因为一旦我们通过
clientid
进行聚合,就不再清楚我们应该为预订参考、代码等取哪个值。如果您真的需要此跟进,那么您应该在您的问题中添加一些示例数据。当然,我理解。如果我这样做:“选择clientid,左(tourno,1)作为客户群中的tourno,按clientid,tourno具有计数(当tour_日期介于'2017-01-01'和'2017-12-31'之间时,则1结束)>0和计数(当tour_日期介于'2018-01-01'和'2018-12-31'之间时,则1结束)>0和计数(当tour_日期<'2019-01-01'时,则1结束)>0然后,我为每个客户ID和每个Tourno获取一行,这样一个客户ID可以与3个单独的客户ID一起出现3次,或者只出现一次,这意味着他们多次购买“E”产品。问题是我不能给这个添加巡演日期。这个很好用,谢谢-有没有办法给查询添加更多的列?谢谢例如,cust中的每一行都有客户ID、他们的预订参考、产品代码等。我希望在一列中看到客户ID,在下一列中看到产品代码“left(tourno,1)as tourno”编辑:nevermind,对其进行排序。助教!这是一个有点开放性的问题,因为一旦我们通过
clientid
进行聚合,就不再清楚我们应该为预订参考、代码等取哪个值。如果您真的需要此跟进,那么您应该在您的问题中添加一些示例数据。当然,我理解。如果我这样做:“选择clientid,左(tourno,1)作为客户群中的tourno,按clientid,tourno具有计数(当tour_日期介于'2017-01-01'和'2017-12-31'之间时,则1结束)>0和计数(当tour_日期介于'2018-01-01'和'2018-12-31'之间时,则1结束)>0和计数(当tour_日期<'2019-01-01'时,则1结束)>0然后,我为每个客户ID和每个Tourno获取一行,这样一个客户ID可以与3个单独的客户ID一起出现3次,或者只出现一次,这意味着他们多次购买“E”产品。问题是我无法将巡演日期添加到此。