Выберите сгруппированы только по столбцу, а не по совокупности - PullRequest
1 голос
/ 31 марта 2011

В операторе выбора MySql, включающем агрегацию, можно ли выбрать просто сгруппированными по столбцу без агрегат?

В основном я хочу выбрать идентификаторы в подзапросе в соответствии с критериями, основанными на совокупности, в данном случае общая сумма платежей клиенту:

select idclient, business_name from client where idclient in
(
  select idclient, sum(amount) as total 
  from payment 
  group by idclient
  having total > 100
)

... но это не с ошибкой Operand should contain 1 column(s), потому что подзапрос выбирает как идентификатор (который я хочу), так и общее количество (что я не делаю). Можно ли каким-либо образом исключить total из результата подзапроса?

Редактировать: если возможно, я бы предпочел не использовать соединение - предложение where передается другой существующей функции самостоятельно.

Извиняюсь, если это дурак - я действительно искал, честно. Я не смог найти точного ответа в массе вопросов SQL-агрегатов.

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Ваш запрос должен быть таким:

select idclient, business_name from client where idclient in
(
  select idclient 
  from payment 
  group by idclient
  having sum(amount) > 100
)

Вам нужно поместить агрегатную функцию в условие Наличие, а в подзапросе необходимо выбрать количество столбцов, такое же, как в предложении where.

1 голос
/ 31 марта 2011
WHERE idclient IN (...)

Материал внутри (...) является подзапросом. Очевидно, он должен возвращать только один столбец, потому что для предложения IN нужен только один столбец данных.

Вы можете опустить столбец итога:

SELECT idclient
FROM payment
GROUP BY idclient
HAVING SUM(amount) > 100
0 голосов
/ 31 марта 2011

Вы также можете попробовать это:

SELECT c.idclient, c.business_name
FROM payment p
  INNER JOIN client c ON c.idclient = p.idclient
GROUP BY c.idclient, c.business_name
HAVING SUM(p.amount) > 100

И, поскольку столбец client.idclient очень похож на PK, вы, возможно, даже можете опустить client.business_name в GROUP BY. Таким образом, окончательный запрос будет выглядеть так:

SELECT c.idclient, c.business_name
FROM payment p
  INNER JOIN client c ON c.idclient = p.idclient
GROUP BY c.idclient
HAVING SUM(p.amount) > 100
...