2013-11-20 175 views
0
   SELECT 
       EmailOfConsumer, 
       COUNT(EmailOfConsumer) as 'NumberOfOrders', 
       SUM(CAST(Total as money)) as 'TotalValue', 
       (SUM(CAST(Total as money))/COUNT(EmailOfConsumer)) as 'AverageValue' 
       FROM webshop 
       GROUP BY EmailOfConsumer 
       ORDER BY TotalValue DESC 

此带回:查询计数记录用WHERE子句

EmailOfConsumer NumberOfOrders TotalValue    AverageValue 
test     1    2000000000.10   2000000000.10 

我想在WHERE NumberOfOrders = '1'

添加一个搜索我曾尝试加入WHERE COUNT(EmailOfConsumer) = '1'

,但我得到此错误:

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a 
HAVING clause or a select list, and the column being aggregated is an outer reference. 
+0

为什么将数值与字符串进行比较?例如,'COUNT'返回一个'INT',并将它与'1'比较而不是'1'是特有的。比较空的字符串更奇怪。 – HABO

回答

2

使用

HAVING COUNT(EmailOfConsumer) = 1 

having子句限制了聚合,而只能在where子句出台限制有关个人列数据

+0

或者添加“HAVING TotalValue/AverageValue = 0”。顺便说一句:我建议不要使用'1'作为值,而是使用实数1(无'),否则MySQL会投射字符串,效率会降低。此外,HAVING非常慢,在查询完成处理后它可以工作 - 所以使用它被认为是不好的做法。 – nrathaus

+1

在GROUP BY子句之后添加HAVING子句并在ORDER BY –

+0

之前添加HAVING子句@JackJiang只有在值不为空时才知道如何添加此HAVING子句? – neeko

1
SELECT 
       EmailOfConsumer, 
       COUNT(EmailOfConsumer) as 'NumberOfOrders', 
       SUM(CAST(Total as money)) as 'TotalValue', 
       (SUM(CAST(Total as money))/COUNT(EmailOfConsumer)) as 'AverageValue' 
       FROM webshop 
       GROUP BY EmailOfConsumer 

HAVING COUNT(EmailOfConsumer) = '1' 
       ORDER BY TotalValue DESC 
1

您可以尝试

SELECT 
      EmailOfConsumer, 
      COUNT(EmailOfConsumer) as 'NumberOfOrders', 
      SUM(CAST(Total as money)) as 'TotalValue', 
      (SUM(CAST(Total as money))/COUNT(EmailOfConsumer)) as 'AverageValue' 
      FROM webshop 
      GROUP BY EmailOfConsumer 
      HAVING COUNT(EmailOfConsumer) = 1 
      ORDER BY TotalValue DESC 
1

您需要添加过滤条件在HAVING clause也算回报率的数值,以便无需添加引号,以检查它

SELECT  EmailOfConsumer, 
      COUNT(EmailOfConsumer) as 'NumberOfOrders', 
      SUM(CAST(Total as money)) as 'TotalValue', 
      (SUM(CAST(Total as money))/COUNT(EmailOfConsumer)) as 'AverageValue' 
      FROM webshop 
      GROUP BY EmailOfConsumer 
      HAVING COUNT(EmailOfConsumer) = 1 
      ORDER BY TotalValue DESC 

你不能COUNT in WHERE clause检查条件,因为它会聚集之前执行,所以你需要聚集后,检查它HAVING clause

1

使用此查询:

SELECT 
    EmailOfConsumer, 
    COUNT(EmailOfConsumer) as 'NumberOfOrders', 
    SUM(CAST(Total as money)) as 'TotalValue', 
    (SUM(CAST(Total as money))/COUNT(EmailOfConsumer)) as 'AverageValue' 
FROM webshop 
GROUP BY EmailOfConsumer 
HAVING COUNT(*) = 1 
ORDER BY TotalValue DESC 

注:

  • WHERE条款之前GROUP BY,而HAVING条款如下GROUP BY
  • WHERE条款一个过滤器之前行ggregation; HAVING子句过滤器汇总行
  • COUNT(...)返回一个数字,所以常量1应该而不是被括在引号中。
2

使用group by,然后使用子句。请参阅this

SELECT 
      EmailOfConsumer, 
      COUNT(EmailOfConsumer) as 'NumberOfOrders', 
      SUM(CAST(Total as money)) as 'TotalValue', 
      (SUM(CAST(Total as money))/COUNT(EmailOfConsumer)) as 'AverageValue' 
      FROM webshop 
      GROUP BY EmailOfConsumer 
      HAVING COUNT(EmailOfConsumer) = '1' 
      ORDER BY TotalValue DESC