【问题标题】:Using multiple HAVING with multiple WHERE statement PSQL使用多个 HAVING 和多个 WHERE 语句 PSQL
【发布时间】:2022-01-27 05:17:35
【问题描述】:

我有一个 psql 查询,其中在分组中使用了多个 WHERE 子句(带括号)

SELECT * 
FROM customers
WHERE (location = 'NYC' OR location = 'BK')
  AND (age > 18)

请注意,我有 2 个条件一起使用括号分组。

现在我正在尝试使用COUNT 函数从我的数据集中获取另一个数据,并且我目前正在使用HAVING 语句进行此操作。问题是似乎没有办法多次使用HAVING(在每个括号中),而应该在AND之后只使用一次,或者做类似HAVINGx和y等的事情。但是这不是我想要的。

我需要在每个括号中使用HAVING,如下所示:

SELECT customers.id as id 
FROM customers
INNER JOIN friends ON friends.id = customers.id
WHERE (location = 'NYC' OR location = 'BK'
       GROUP BY customers.id
       HAVING COUNT(friends.id) > 2)
  AND (age > 18
       GROUP BY customers.id
       HAVING COUNT(friends.id) > 10);

基本上(居住在纽约或 BK 的客户有 2 个朋友)和(18 岁以上的客户有超过 10 个朋友)

【问题讨论】:

  • 使用方括号将它们分成几组是绝对关键的 :)
  • 如何将 SQL 查询分成两部分,并在两部分上使用 UNION?
  • 您缺少重要的必要信息。花几分钟时间回顾How to Ask。具体来说,更新您的问题以包括表定义 (ddl) 和示例数据(或者更好的是 fiddle)以及该数据的预期结果。全部作为文本 - 没有图像。另请查看Select 语句结构。每个选择或子选择只能有 1 个 having 子句。

标签: sql postgresql


【解决方案1】:
SELECT c.id
FROM customers c
    INNER JOIN friends f ON f.id = c.id
WHERE
    c.location = ('NYC', 'BK') or c.age > 18
GROUP BY c.id
HAVING COUNT(*) >
    case when min(c.location) in ('NYC', 'BK') then 2
         when min(c.age) > 18 then 10 end

当条件重叠时,不清楚适用哪个要求。如果您实际上想要的不仅仅是 id,请使用虚拟聚合或查看 count(*) over (partition by.id)

【讨论】:

    【解决方案2】:

    可以在COUNT 中使用CASE WHEN
    并在HAVING 子句中使用它。

    SELECT customer.id 
    FROM customers AS customer
    INNER JOIN friends AS friend
      ON friend.id = customer.id
    GROUP BY customer.id
    HAVING (   
       COUNT(CASE WHEN friend.location IN ('NYC','BK') 
             THEN friend.id END) > 2
       AND
       COUNT(CASE WHEN friend.age > 18 
             THEN friend.id END) > 10
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      相关资源
      最近更新 更多