【问题标题】:SQL Server clause issueSQL Server 子句问题
【发布时间】:2021-05-22 15:21:47
【问题描述】:

选择在 6 月份进行了 MAXIMUM 交易的客户的姓名、联系方式和邮政编码。

SELECT 
    Customer.customer_name, 
    Customer.customer_email, 
    Customer.customer_postcode
FROM
    Customer
INNER JOIN 
    Sales on Customer.customer_id = Sales.customer_id
WHERE 
    MAX(Sales.customer_id) IN (SELECT COUNT((sales.customer_id)) AS 'transactions'
                               FROM sales
                               GROUP BY (sales.customer_id)) 
    AND MONTH(date_purchased) = 6;

但我收到此错误:

消息 147,第 15 级,状态 1,第 4 行
聚合可能不会出现在 WHERE 子句中,除非它在 ​​HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用

【问题讨论】:

  • 您在 GROUP BY 子句之后而不是在 WHERE 子句末尾添加了一个条件 (and month(date_purchased)=6),并且还有第二个 FROM 子句。您应该在第一个 FROM 子句中添加一个 join 子句。
  • MONTH(date_purchased) 这将包括任何一年的交易,只要月份是六月。这真的是你要使用的逻辑吗?

标签: sql sql-server database


【解决方案1】:

您正在获取 customer_id 的 MAX,但您想要的是交易次数最多的 customer_id。从您的内部查询开始,使用ORDER BY..DESC 获得顶级客户。

SELECT Sales.customer_id, count(Sales.customer_id) as transactions
FROM Sales
GROUP BY Sales.customer_id
ORDER BY transactions DESC;

现在您有了最高的 customer_id,您应该能够在 Customers 表中加入该结果(将其用作 CTE 或内部查询)以获取姓名、联系方式和邮政编码。

【讨论】:

    【解决方案2】:

    您当前的查询存在许多问题:

    • MAX 等聚合不能在 WHERE 中使用,它们必须在 HAVING 部分中。
    • 即使你把它改成HAVING,子查询也是错误的,因为它在六月没有过滤
    • 更简单的方法是加入表格、分组,然后按COUNT 排序并取第一行
    • 外部 June 过滤器应使用开始和结束日期,而不是 MONTH 函数,以提高性能
    • 您应该使用正确的表别名
    SELECT TOP (1)
        c.customer_name, 
        c.customer_email, 
        c.customer_postcode
    FROM
        Customer c
    INNER JOIN 
        Sales s on Customer.customer_id = Sales.customer_id
    WHERE 
        date_purchased >= '20200601' AND date_purchased < '20200701'
        -- note the use of half open interval >= AND <
    GROUP BY
        c.customer_name, 
        c.customer_email, 
        c.customer_postcode
    ORDER BY COUNT(*) DESC;
    

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 1970-01-01
      • 2011-08-28
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多