【问题标题】:Creating variable in SQL and using in WHERE clause在 SQL 中创建变量并在 WHERE 子句中使用
【发布时间】:2017-03-19 22:05:55
【问题描述】:

我想创建一个变量来计算每个客户 ID 在 CSV 中出现的次数,然后我希望输出是出现 0、1 或 2 次的所有客户 ID。到目前为止,这是我的代码:

SELECT Customers.customer_id , COUNT(*) AS counting
FROM Customers 
LEFT JOIN Shopping_cart ON Customers.customer_id = Shopping_cart.customer_id
WHERE counting = '0' 
   OR counting = '1' 
   OR counting = '2' 
GROUP BY Customers.customer_id; 

【问题讨论】:

  • 请为您正在使用的数据库添加标签,例如SQL Server 2016,MySQL。
  • 我目前不明白这个问题。您想要出现 0 到 2 次的所有客户 ID?
  • 如果某个答案对您有帮助,请将其标记为答案......

标签: sql sqlite count


【解决方案1】:
SELECT Customers.customer_id , COUNT(*) AS counting
FROM Customers LEFT JOIN Shopping_cart on Customers.customer_id=Shopping_cart.customer_id
WHERE COUNT(*) < 3
GROUP BY Customers.customer_id; 

查询对所有客户 ID 进行分组,并使用 count() 获取组中的项目数。因此,对于您的解决方案,您调用组计数()并只说组计数小于 3 的项目。小于 3 的项目包括(0、1、2)。您可以在查询中重复使用 count()。

【讨论】:

  • 也许您可以通过添加解释为什么会起作用来改进您的答案。
  • 您不能在 WHERE 子句中使用聚合。
【解决方案2】:

您可能想到的是HAVING,而不是WHERE

例如:

select JOB, COUNT(JOB) from SCOTT.EMP
group by JOB
HAVING count(JOB) > 1 ;

虽然有点奇怪,但您可能会具体说明 HAVING 条件:

HAVING count(JOB) = 2 or count(JOB) = 4

注意:WHERE 子句用于过滤行,它适用于每一行,而 HAVING 子句用于过滤组。

【讨论】:

    【解决方案3】:

    您可以使用 HAVING 子句在聚合之后应用过滤器。 请注意count(*) 计算所有行,包括空行,因此您不能使用它来检测没有购物车的客户;您必须改为计算某些列中的非 NULL 值:

    SELECT customer_id,
           count(Shopping_cart.some_id) AS counting
    FROM Customers 
    LEFT JOIN Shopping_cart USING (customer_id)
    GROUP BY customer_id
    HAVING count(Shopping_cart.some_id) BETWEEN 0 and 2;
    

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 2020-04-16
      • 2014-02-16
      • 2014-04-11
      • 2016-05-18
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多