问题
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
This brings back:
EmailOfConsumer NumberOfOrders TotalValue AverageValue
test 1 2000000000.10 2000000000.10
I would like to add a search on WHERE NumberOfOrders = '1'
I have tried adding WHERE COUNT(EmailOfConsumer) = '1'
but I get this error:
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.
回答1:
use
HAVING COUNT(EmailOfConsumer) = 1
The having clause restricts a aggregate whereas the where clause only put restrictions on individual column data
回答2:
Using group by and then having clause. Refer 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
回答3:
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
回答4:
You can try
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
回答5:
Use this query:
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
Notes:
WHERE
clause precedesGROUP BY
, whileHAVING
clause followsGROUP BY
WHERE
clause filters rows before aggregation;HAVING
clause filters aggregated rowsCOUNT(...)
returns a number, so the constant1
should not be enclosed in quotes.
回答6:
You need to add filter condition in HAVING clause
. Also COUNT returns numeric value so no need to add quote to check it :
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
You can't check condition with COUNT in WHERE clause
because it will execute before aggregation, so you need to check it after aggregation in HAVING clause
.
来源:https://stackoverflow.com/questions/20098378/query-that-counts-records-with-a-where-clause