2016-05-24 6 views
0

Позвольте сказать, что у меня есть таблица «заказы», ​​и мне нужно распечатать список клиентов, которые потратили более 100 $. Для этого я использую HAVING и GROUP BY:получить общую сумму с HAVING и GROUP BY

SELECT clientID, SUM(amount) AS spent 
FROM orders 
GROUP BY clientID 
HAVING spent >= 100; 

Теперь мне интересно, если в одном запросе можно получить общую сумму, потраченную на всех этих клиентов, потративших более, что $ 100, а общее количество клиентов/строк.

  • John> 125 $
  • МЭ> 100 $
  • ИТОГО> 225 $ (2 клиент)

ответ

2

WITH ROLLUP является вашим другом.

SELECT clientID, SUM(amount) AS spent 
FROM orders 
GROUP BY clientID 
WITH ROLLUP 
HAVING spent >= 100; 
1

Стандарт ANSI SQL-92 стандартный подход:

SELECT clientID, SUM(amount) AS spent 
FROM orders 
GROUP BY clientID 
HAVING SUM(amount) >= 100; 

WITH ROLLUP подход даст строку с нулевым ClientID и sum(amount) во всех clientIDs

MySQL будет также поддерживать:

SELECT clientID, SUM(amount) AS spent 
FROM orders 
GROUP BY clientID 
HAVING spent >= 100; 

Чтобы ответить на вопрос на самом деле

SELECT clientID, SUM(spent) as spent 
FROM (
    SELECT clientID, SUM(amount) AS spent 
    FROM orders 
    GROUP BY clientID 
    HAVING spent >= 100 
) 
GROUP BY clientID 
WITH ROLLUP;