Выберите сгруппированные только по столбцу, а не по совокупности

В операторе select 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.


person Rob Agar    schedule 31.03.2011    source источник


Ответы (3)


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

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

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

person anubhava    schedule 31.03.2011
comment
Благодарность! Я не знаю, откуда я взял идею, что «иметь» можно использовать только выбранные столбцы:\ - person Rob Agar; 31.03.2011

WHERE idclient IN (...)

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

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

SELECT idclient
FROM payment
GROUP BY idclient
HAVING SUM(amount) > 100
person Stephen Chung    schedule 31.03.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
person Andriy M    schedule 31.03.2011