【问题标题】:I need to select clients who have multiple records in one column我需要选择在一列中有多个记录的客户
【发布时间】:2019-05-10 18:38:06
【问题描述】:

我的任务是选择所有在 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'

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: sql


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我们也可以在这里尝试使用聚合:

      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;
      

      【讨论】:

      • 这个非常好用,谢谢 - 有没有办法在查询中添加更多列?谢谢。例如,cust 中的每一行都有客户 ID、他们的预订参考、产品代码等。我想在一列中看到客户 ID,在下一列中看到产品代码“left(tourno,1) as Tourno “ 编辑:没关系,排序。塔!
      • 这是一个开放式问题,因为一旦我们通过clientid 进行汇总,就不再清楚我们应该为预订参考取哪个值,代码等。如果你真的需要这个跟进,那么你应该在你的问题中添加一些示例数据。
      • 当然,我明白了。如果我这样做:“选择 clientid,left(tourno,1) as Tourno FROM cust GROUP BY clientid, tourno HAVING COUNT(CASE WHEN tour_date BETWEEN '2017-01-01' AND '2017-12-31' THEN 1 END) > 0 和计数(当 tour_date 在 '2018-01-01' 和 '2018-12-31' 然后 1 结束时的情况)> 0 和计数(当 tour_date 0 ;"然后我为每个客户 ID 和每个 Tourno 获得一行,因此一个客户 ID 可以出现 3 次,带有 3 个单独的客户 ID,或者只出现一次,这意味着他们多次购买了“E”产品。问题是我无法为此添加 tour_date。
      【解决方案3】:

      试试这个-

      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
      

      【讨论】:

        【解决方案4】:

        如果您想要客户而不是他们的旅行详情,请使用聚合。我将其表述为:

        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 子句中的每个条件都在计算相关年份的游览次数。比较&gt; 0 表示至少有一个; = 0 表示当年没有。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 2014-03-09
          • 2023-03-30
          • 2011-06-14
          • 2017-04-11
          • 1970-01-01
          相关资源
          最近更新 更多