2015-09-10 3 views
0

A есть таблица со строками, которая содержит данные счета и данные человека, к которым они принадлежат.Вложенный MySQL-выбор

Что-то вроде

name, birthday, sex, invoice_date, invoice_amount 

Прежде всего я хочу, чтобы получить все наборы данных для каждого уникального человека. Итак, я делаю выбор

SELECT * FROM data WHERE invoice_amount < 10 GROUP BY name, birthday 

С этим я фильтрую все дубликаты записей для тех же лиц.

Теперь я хочу знать, сколько из этих лиц являются женщинами - не все строки, но сгруппированные результаты. Я имею в виду, что хочу сделать выбор из результатов (я не думаю о WHERE invoice_amount <10 AND sex = 1). Как мне это сделать?

Как я могу сделать вложенный выбор для этого примера?

ответ

1

Вы всегда можете использовать подзапрос:

SELECT sex, count(*) 
FROM (
    SELECT * FROM data WHERE invoice_amount < 10 GROUP BY name, birthday 
) s 
GROUP BY sex 

но, пожалуйста, обратите внимание, что не считаются хорошей практикой, чтобы выбрать все поля, а группа меньшего количества полей без использования агрегированных функций. Я бы лучше написать запрос так:

SELECT sex, COUNT(DISTINCT name, birthday) 
FROM data 
WHERE invoice_amount < 10 
GROUP BY sex 

Update

В таблице не нормируется так, может случиться так, что тот же человек (такое же имя и тот же день рождения) имеет различную сексуальную информацию о разных строках ,

У вас есть два варианта. Вы можете просто проигнорировать проблему, несколько ошибок в большом наборе данных не будут (возможно) иметь большое значение, поэтому вы можете использовать запрос с подзапросом.

Если вы SELECT * но использовать только GROUP BY name, birthday, вы получите только одну строку для каждого человека с одним значением для секса (если есть несколько значений, то один вы получите непредсказуема, но это может быть штраф на огромном наборе данных).

Но если вы хотите, чтобы определить, какие записи неверны вы можете использовать это:

SELECT name, birthday 
FROM data 
GROUP BY name, birthday 
HAVING COUNT(DISTINCT sex)>1 
+0

Спасибо. Теперь я вижу, что в моей огромной базе данных есть несколько небольших ошибок: есть несколько строк данных-фактур, но некоторые из них имеют неправильную информацию о сексе. То есть пять рядов для мистера Смита, но в одном ряду он поставлен как женщина. Итак, как я могу найти эти наборы данных? – user3142695

+0

@ user3142695 см. Мой обновленный ответ – fthiella

Смежные вопросы